[转载]Entity Framework 实体框架的形成之旅--Code First的框架设计(5) - 伍华聪 - 博客园

mikel阅读(1453)

[转载]Entity Framework 实体框架的形成之旅–Code First的框架设计(5) – 伍华聪 – 博客园.

在前面几篇介绍了Entity Framework 实体框架的形成过程,整体框架主要是基于Database First的方式构建,也就是利用EDMX文件的映射关系,构建表与表之间的关系,这种模式弹性好,也可以利用图形化的设计器来设计表之间的关系,是开发 项目较多采用的模式,不过问题还是这个XML太过复杂,因此有时候也想利用Code First模式构建整个框架。本文主要介绍利用Code First 来构建整个框架的过程以及碰到的问题探讨。

 1、基于SQLServer的Code First模式

为了快速了解Code First的工作模式,我们先以微软自身的SQLServer数据库进行开发测试,我们还是按照常规的模式先构建一个标准关系的数据库,如下所示。

这个表包含了几个经典的关系,一个是自引用关系的Role表,一个是User和Role表的多对多关系,一个是User和UserDetail之间的引用关系。

一般情况下,能处理好这几种关系,基本上就能满足大多数项目上的要求了。这几个表的数据库脚本如下所示。

复制代码
create table dbo.Role (
   ID                   nvarchar(50)         not null,
   Name                 nvarchar(50)         null,
   ParentID             nvarchar(50)         null,
   constraint PK_ROLE primary key (ID)
)
go

create table dbo."User" (
   ID                   nvarchar(50)         not null,
   Account              nvarchar(50)         null,
   Password             nvarchar(50)         null,
   constraint PK_USER primary key (ID)
)
go

create table dbo.UserDetail (
   ID                   nvarchar(50)         not null,
   User_ID              nvarchar(50)         null,
   Name                 nvarchar(50)         null,
   Sex                  int                  null,
   Birthdate            datetime             null,
   Height               decimal              null,
   Note                 ntext                null,
   constraint PK_USERDETAIL primary key (ID)
)
go

create table dbo.UserRole (
   User_ID              nvarchar(50)         not null,
   Role_ID              nvarchar(50)         not null,
   constraint PK_USERROLE primary key (User_ID, Role_ID)
)
go

alter table dbo.Role
   add constraint FK_ROLE_REFERENCE_ROLE foreign key (ParentID)
      references dbo.Role (ID)
go

alter table dbo.UserDetail
   add constraint FK_USERDETA_REFERENCE_USER foreign key (User_ID)
      references dbo."User" (ID)
go

alter table dbo.UserRole
   add constraint FK_USERROLE_REFERENCE_ROLE foreign key (Role_ID)
      references dbo.Role (ID)
go

alter table dbo.UserRole
   add constraint FK_USERROLE_REFERENCE_USER foreign key (User_ID)
      references dbo."User" (ID)
go
复制代码

我们采用刚才介绍的Code Frist方式来构建实体框架,如下面几个步骤所示。

1)选择来自数据库的Code First方式。

2)选择指定的数据库连接,并选择对应的数据库表,如下所示(包括中间表UserRole)。

生成项目后,项目工程会增加几个类,包括Role实体类,User实体类,UserDetail实体类(没有中间表UserRole的实体类),还有一个是包含这些实体类的数据库上下文关系,它们的表之间的关系,是通过代码指定的,没有了EDMX文件了。

几个类文件的代码如下所示,其中实体类在类定义的头部,增加了[Table(“Role”)]的说明,表明了这个实体类和数据库表之间的关系。

复制代码
    [Table("Role")]
    public partial class Role
    {
        public Role()
        {
            Children = new HashSet<Role>();
            Users = new HashSet<User>();
        }

        [StringLength(50)]
        public string ID { get; set; }

        [StringLength(50)]
        public string Name { get; set; }

        [StringLength(50)]
        public string ParentID { get; set; }

        public virtual ICollection<Role> Children { get; set; }

        public virtual Role Parent { get; set; }

        public virtual ICollection<User> Users { get; set; }
    }
复制代码

其他类如下所示。

复制代码
    [Table("User")]
    public partial class User
    {
        public User()
        {
            UserDetails = new HashSet<UserDetail>();
            Roles = new HashSet<Role>();
        }

        [StringLength(50)]
        public string ID { get; set; }

        [StringLength(50)]
        public string Account { get; set; }

        [StringLength(50)]
        public string Password { get; set; }

        public virtual ICollection<UserDetail> UserDetails { get; set; }

        public virtual ICollection<Role> Roles { get; set; }
    }
复制代码
复制代码
    [Table("UserDetail")]
    public partial class UserDetail
    {
        [StringLength(50)]
        public string ID { get; set; }

        [StringLength(50)]
        public string User_ID { get; set; }

        [StringLength(50)]
        public string Name { get; set; }

        public int? Sex { get; set; }

        public DateTime? Birthdate { get; set; }

        public decimal? Height { get; set; }

        [Column(TypeName = "ntext")]
        public string Note { get; set; }

        public virtual User User { get; set; }
    }
复制代码

还有一个就是生成的数据库上下文的类。

复制代码
    public partial class DbEntities : DbContext
    {
        public DbEntities() : base("name=Model1")
        {
        }
        public virtual DbSet<Role> Roles { get; set; }
        public virtual DbSet<User> Users { get; set; }
        public virtual DbSet<UserDetail> UserDetails { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Role>()
                .HasMany(e => e.Children)
                .WithOptional(e => e.Parent)
                .HasForeignKey(e => e.ParentID);

            modelBuilder.Entity<Role>()
                .HasMany(e => e.Users)
                .WithMany(e => e.Roles)
                .Map(m => m.ToTable("UserRole"));

            modelBuilder.Entity<User>()
                .HasMany(e => e.UserDetails)
                .WithOptional(e => e.User)
                .HasForeignKey(e => e.User_ID);

            modelBuilder.Entity<UserDetail>()
                .Property(e => e.Height)
                .HasPrecision(18, 0);
        }
    }
复制代码

上面这个数据库上下文的操作类,通过在OnModelCreating函数里面使用代码方式指定了几个表之间的关系,代替了EDMX文件的描述。

这样好像看起来比EDMX文件简单了很多,感觉很开心,一切就那么顺利。

如果我们使用这个数据库上下文进行数据库的插入,也是很顺利的执行,并包含了的多个表之间的关系处理,代码如下所示。

复制代码
        private void NormalTest()
        {
            DbEntities db = new DbEntities();
            Role role = new Role() { ID = Guid.NewGuid().ToString(), Name = "test33" };

            User user = new User() { ID = Guid.NewGuid().ToString(), Account = "test33", Password = "test33" };
            UserDetail detail = new UserDetail() { ID = Guid.NewGuid().ToString(), Name = "userName33", Sex = 1, Note = "测试内容33", Height = 175 };
            user.UserDetails.Add(detail);

            role.Users.Add(user);

            db.Roles.Add(role);
            db.SaveChanges();

            List<Role> list = db.Roles.ToList();
        }
复制代码

我们发现,通过上面代码的操作,几个表都写入了数据,已经包含了他们之间的引用关系了。

2、基于泛型的仓储模式实体框架的提炼

为了更好对不同数据库的封装,我引入了前面介绍的基于泛型的仓储模式实体框架的结构,希望后面能够兼容多种数据库的支持,最终构建代码的分层结构如下所示。

使用这种框架的分层,相当于为各个数据库访问提供了统一标准的通用接口,为我们利用各种强大的基类快速实现各种功能提供了很好的保障。使用这种分层的框架代码如下所示。

复制代码
        private void FrameworkTest()
        {
            Role role = new Role() { ID = Guid.NewGuid().ToString(), Name = "test33" };

            User user = new User() { ID = Guid.NewGuid().ToString(), Account = "test33", Password = "test33" };
            UserDetail detail = new UserDetail() { ID = Guid.NewGuid().ToString(), Name = "userName33", Sex = 1, Note = "测试内容33", Height = 175 };
            user.UserDetails.Add(detail);

            role.Users.Add(user);

            IFactory.Instance<IRoleBLL>().Insert(role);

            ICollection<Role> list = IFactory.Instance<IRoleBLL>().GetAll();

        }
复制代码

我们发现,这部分代码执行的效果和纯粹使用自动生成的数据库上下文DbEntities 来操作数据库一样,能够写入各个表的数据,并添加了相关的应用关系。

满以为这样也可以很容易扩展到Oracle数据库上,但使用SQLServer数据库生成的实体类,在Oracle数据库访问的时候,发现它生成的实体类名称全部是大写,一旦修改为Camel驼峰格式的字段,就会出现找不到对应表字段的错误。

寻找了很多解决方案,依旧无法有效避免这个问题,因为Oracle本身的表或者字段名称是大小写敏感的,关于Oracle这个问题,先关注后续解决 吧,不过对于如果不考虑支持多种数据库的话,基于SQLServer数据库的Code First构建框架真的还是比较方便,我们不用维护那个比较麻烦的EDMX文件,只需要在代码函数里面动态添加几个表之间的关系即可。

 

这个系列文章索引如下:

Entity Framework 实体框架的形成之旅–基于泛型的仓储模式的实体框架(1)

Entity Framework 实体框架的形成之旅–利用Unity对象依赖注入优化实体框架(2)

Entity Framework 实体框架的形成之旅–基类接口的统一和异步操作的实现(3)

Entity Framework 实体框架的形成之旅–实体数据模型 (EDM)的处理(4)

Entity Framework 实体框架的形成之旅–Code First的框架设计(5)

主要研究技术:代码生成工具、Visio二次开发、客户关系管理软件、病人资料管理软件、送水管理软件等共享软件开发
专注于Winform开发框架Web开发框架、WCF开发框架、微信门户开发框架的研究及应用。
转载请注明出处:
撰写人:伍华聪  http://www.iqidi.com

人傻、钱多、没人管的互联网

mikel阅读(1116)

3.15之前还在信誓旦旦的“人傻、钱多、没人管”的互联网是曝光点的导演,不想在两会的互联网利好消息下,也赶紧找了一帮顶刀的企业上台,让互联网的企业幸免被爆,不知道这一年真的就那么平静吗?从P2P的乱象就可以看出“人傻、钱多、没人管”的确是成了事实,浙江台州一家注册资金5000万的P2P平台,开业第一天就跑路,创下了P2P最短命历史纪录,而深圳成立的一家P2P平台,上线运营仅1天后,平台老板就携投资逃跑。

互联网上傻得是小白,那些靠各种手段和推广营销套路的大佬们,早已经把握了小白们的人性弱点,玩弄于股掌之间了,让那些小白傻傻的在贡献着广告、弹窗等等收入,从个人信息到QQ号等等都是互联网上的商品,没有不能卖的,这就是互联网的乱象之一,老鸟欺负小白,骨灰玩家把握大把资源盈利。

钱多不多我不知道,但是阿里巴巴是上市了,马云成首付了,然后就出来了淘宝网上卖的货不是假货也不是仿货,是“网货”!一下子让人民知道了淘宝的网货,也知道了互联网得市场有多大了。

没人管是真的,要不然一天跑路也不会出现,这就是国内互联网的发展速度太快结果倒逼各项法律法规与时俱进,可是法律还没出互联网就又变了,面对变化也是让人醉了,这互联网刚刚规范了点儿,结果又来了移动互联网,然后逼着互联网又变了,法律法规更加捉襟见肘,不得不仓促间出点儿规范之类不痛不痒的条例,还不如网站备案和大局域网来得猛烈,不由得问还能再乱点儿吗?!

总而总之3.15过去了,曝光了就曝光了,没曝光的还是存在,互联网上还是自己留些心眼儿,要不然乱世之下哪有不湿鞋的!

用户为王 服务为王的时代来了

mikel阅读(1000)

过去一直喊着“内容为王”的时代已经过时,服务为王的时代来了。为什么这么说因为自媒体来了。

过去式大众被动接受记者和媒体推送的信息,完全没有自主性,自从自媒体来了,人人都是信息源,都可以发布信息,信息更新速度很快,用户为王的时代来了,用户越来越挑剔,让传统的媒体头疼,如何更好服务读者和用户才是2015年媒体的最大卖点。

过去建站喊着内容为王,深挖内容做媒体老大,如今没有好的服务,尽管流量很多,但是转化率很低,用户对网站的服务更加看重的同时是刁钻的挑剔内容是不是对自己有价值,而不是像过去盲目的随波逐流,个性化服务代替大众化服务的时代来临,互联网只是个开始,从移动互联网就可以看出重口真的是难调,于是乎各个应用的盈利模式,也从过去的插屏广告,到最后的功能免费,个性服务收费向服务为王的时代来临,印象笔记的盈利模式就是这种,应用的功能是免费的,但是要想定制加密或者云存储空间的服务是收费的。

传统互联网网站越来越多的是在痛苦的转型或者卖身,中关村在线15亿卖给了慧聪网,一下次让2015年的站长圈里爆了寒气,纷纷“卖身求荣”的背后是“内容为王”的时代的终结,互联网特别是移动互联网让信息差距变为零,任何人都可以获取和发布信息,不再需要那些所谓的官方媒体发布了,更何况3.15后各种所谓的官方声音让消费者们不再关注了,微信朋友圈的买卖火的同时是传统媒体网站的消亡。

iptool抓包分析工具新手使用指南

mikel阅读(1251)

.

如上图

1、选择好捕包网卡,左连还有一些其它捕包条件供选择,如果当所选网卡不支持“杂项接收”功能,系统会提 示相应信息,出现该情况时您将无法获取与本网卡无关的数据包,换言之,您无法获取其他电脑之间的通讯包,所以, 建议您更换网卡。 不支持“杂项接收”的网卡,多数为一部分无线网卡及少数专用服务器/笔记本网卡。
2、协议过滤
通常情况下,可不选,除非您对协议类型较为熟悉。
3、设置捕包缓冲
确省的捕包缓冲区大小为 1M,如果您的要追踪的网络规模较大,可适当调大该值;另外,如果追踪主机 CPU 处理能力不够,也需加大缓冲;否则,可能出现丢包的情况。
4、IP过滤
IP过滤里可以设置想要捕包的IP地址或是设置要排除的IP地址等信息。
5、端口过滤
端口过滤过滤里可以设置想要捕包的端口或是设置要排除过滤的端口等信息。

体验“捕包分析”

1、设置捕包过滤项
这里的过滤和“追踪任务”过滤设置是独立分开的,请不要混淆,其可选内容项更多。点按钮,如下图:

上述选项中,最为复杂的是“数据块匹配”部分,详细的介绍将在下面的章节部分出现,这里只需要配置好正确的网卡即可,其他选项可以不做任何设置。

2、开始捕获,点按钮。

通过上述步骤,基本上可以体验到该产品的最基础的功能。

IP包回放
IP包回放的目的是:
1、有助于了解原始包通讯的地理分布情况。
2、通过将IP包回放到网卡上,模拟原始IP包在网络上传输情况,也可供同类捕包软件捕获分析。

通讯协议分析
捕包准备
捕包分析工具条:
开始捕包前,用户需先进行过滤设置,选项内容包括:
选网卡
如果您有多块网卡,需要选中能捕包到预想中的数据的网卡。
协议过滤
针对Internet通讯部分,常见的IP包类型为:TCP/UDP/ICMP。绝大部分是TCP连接的,比如HTTP(s)/SMTP/POP3 /FTP/TELNET等等;一部分聊天软件中除了采用TCP通讯方式外,也采用了UDP的传输方式,如QQ/SKYPE等;而常见的ICMP包是由客户 的Ping产生的。设置界面如下:


IP过滤
“IP过滤”在捕包过滤使用最为常见,IP匹配主要分两类:一是不带通讯方向,单纯的是范围的匹配,如上图中的“From:to”类型;另外一类是带通讯 方向的一对一匹配,如上图“< — >”类型,不仅匹配IP地址,也匹配通讯的源IP和目标IP的方向。
端口过滤
“端口过滤”只针对两种类型的DoD-IP包:TCP/UDP。
数据区大小
“数据区大小” 的匹配针对所有DoD-IP类型包,不过需要说明的是,TCP/UDP的IP数据区是以实际数据区位置开始计算的,而其他类型的则把紧随IP包头后面的部分当作数据区。

数据块匹配
“数据块匹配”较为复杂,但却非常有用,设置界面如下:

在这里,用户可以输入文本,也可以输入二进制,可以选择特定位置的匹配,也可以选择任意位置的匹配,总之,该设置非常灵活好用。
结束条件
如下图,缺省条件下,当捕获的包占用空间多余10M时,自动停止。

结束于某个时间点,是指捕包的截止时间。

分析捕获包
用户按下“开始”按钮启动捕包功能后,列表框中会自动显示出符合条件的数据包,并附带简单的解析。用鼠标右键点击内容,弹出下图中的菜单:

选中“分析”,出现下面的画面:

上图中,左边和右下部分是分析结果,右上部是原始二进制代码,选中左边某一条目时,在右边二进制区域的色块和其一一对应。
如果用户以前少有接触协议分析部分,IPTOOL可以很好地协助您深入了解TCP/IP协议。我们将在网站定期提供一些捕获样例包,协助用户学习分析各种类型的IP包。

返回顶部如果有需要就快下载使用免费的绿色IPTool抓包工具点击下载iptool

 

[转载]浅析Android下的Android.mk文件 - 放飞梦想,成就未来 - 博客频道 - CSDN.NET

mikel阅读(963)

[转载]浅析Android下的Android.mk文件 – 放飞梦想,成就未来 – 博客频道 – CSDN.NET.

1 概述

大家都知道在Linux下编辑经常要写一个Makefile文件, 可以把这个Makefile文件理解成一个编译配置文件,它保存着如何编译的配置信息,即指导编译器如何来编译程序,并决定编译的结果是什么。而在 Android下的Android.mk文件也是类型的功能,顾名思义,从名字上就可以猜测得到,Android.mk文件是针对Android的 Makefile文件.具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次。你可以在每一个Android.mk file中定义一个或多个模块,你也可以在几个模块中使用同一个源代码文件。编译系统为你处理许多细节问题。

2 Android.mk的整体结构

例如一个Android.mk的内容如下:

  1. LOCAL_PATH:= $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_SRC_FILES:= \
  4.     android_media_MediaPlayer.cpp \
  5.     android_media_MediaRecorder.cpp \
  6.     android_media_MediaScanner.cpp \
  7.     android_media_MediaMetadataRetriever.cpp \
  8.     android_media_ResampleInputStream.cpp \
  9.     android_media_MediaProfiles.cpp \
  10.     android_media_AmrInputStream.cpp \
  11.     android_media_Utils.cpp \
  12.     android_mtp_MtpDatabase.cpp \
  13.     android_mtp_MtpDevice.cpp \
  14.     android_mtp_MtpServer.cpp \
  15. LOCAL_SHARED_LIBRARIES := \
  16.     libandroid_runtime \
  17.     libnativehelper \
  18.     libutils \
  19.     libbinder \
  20.     libmedia \
  21.     libskia \
  22.     libui \
  23.     libcutils \
  24.     libgui \
  25.     libstagefright \
  26.     libcamera_client \
  27.     libSQLite \
  28.     libmtp \
  29.     libusbhost \
  30.     libexif
  31. LOCAL_C_INCLUDES += \
  32.     external/jhead \
  33.     external/tremor/Tremor \
  34.     frameworks/base/core/jni \
  35.     frameworks/base/media/libmedia \
  36.     frameworks/base/media/libstagefright/codecs/amrnb/enc/src \
  37.     frameworks/base/media/libstagefright/codecs/amrnb/common \
  38.     frameworks/base/media/libstagefright/codecs/amrnb/common/include \
  39.     frameworks/base/media/mtp \
  40.     $(PV_INCLUDES) \
  41.     $(JNI_H_INCLUDE) \
  42.     $(call include-path-for, corecg graphics)
  43. LOCAL_CFLAGS +=
  44. LOCAL_LDLIBS := -lpthread
  45. LOCAL_MODULE:libmedia_jni
  46. include $(BUILD_SHARED_LIBRARY)
  47. # build libsoundpool.so
  48. # build libaudioeffect_jni.so
  49. include $(call all-makefiles-under,$(LOCAL_PATH))

首先必须定义好LOCAL_PATH变量。然后清除所有LOCAL_XX变量的值,当然LOCAL_PATH的值除外,然后定义源文件,头文件,接着是编译选项参数,紧接着是编译生成的文件名,最后是生成的文件类型.

3 Android.mk内的变量定义

3.1  LOCAL_PATH

一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。例如:

  1. LOCAL_PATH:= $(call my-dir)

宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)

3.2 include $( CLEAR_VARS)

宏CLEAR_VARS 由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES, 等等…),除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。

3.3 LOCAL_SRC_FILES

本次需要编译的源文件

3.4 LOCAL_SHARED_LIBRARIES

本次编译需要链接的动态链接库文件,即.so文件

3.5 LOCAL_STATIC_LIBRARIES

静态链接库.

3.6 LOCAL_C_INCLUDES

本次编译需要包含的头文件,一个相对于当前目录可选的路径名单,当编译所有的源文件(C,C++和汇编)时,它将被添加进include搜索路径。例如:
LOCAL_C_INCLUDES := sources/foo
或者甚至:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo

3.6 LOCAL_LDLIBS

 

本次编译的链接选项,相当于gcc -l后的参数

3.7  LOCAL_CFLAGS

同样是编译选项,相当于gcc -O后面的参数

3.8 LOCAL_MODULE

生成的模块名,这个变量必须定义,表示make后将要生成的文件的名字

3.9 LOCAL_PACKAGE_NAME

apk文件名

4 include

include可Android多以这样的形式出现,如:include $( CLEAR_VARS),include $(BUILD_SHARED_LIBRARY).其实这个include可以理解成”执行”的意思,那么执行什么呢?当然是看后边的宏了.

宏CLEAR_VARS已经在3.2节中介绍过了,表示清除一些变量.

宏BUILD_SHARED_LIBRARY表示生成共享库,即生成.so文件

因此include $(BUILD_SHARED_LIBRARY)就是指定在/system/lib/目录下生成一个lib$(LOCAL_MOUDULE).so文件,同样类型的宏如下:

  • CLEAR_VARS                                             清除LOCAL_xxx变量
  • BUILD_SHARED_LIBRARY                     在/system/lib/目录下生成lib$(LOCAL_MOUDULE).so文件
  • BUILD_STATIC_LIBRARY                         生成lib$(LOCAL_MOUDULE).a文件
  • BUILD_EXECUTABLE                               在/system/bin/目录下生成可执行文件
  • BUILD_PACKAGE                                      编译成一个apk文件

 

2
0
主题推荐
android 源代码 编译器 汇编 结构
猜你在找
android NDK的androidmk文件的详解
cookie 保存用户名密码
关于《FantasyWarrior3D》开源项目编译问题的补充说明
多角度分析为什么 Linux 的硬连接不能指向目录
make编译Qt原码时出现 usrbinld cannot find -lXrender 问题的解决方法
cocos2dx22添加音乐音效以及设置音量
GNU makefile 指南
Android-OpenCV调用CvSmooth实现高斯模糊
SaaS架构设计
如何在Ubuntu111032位下编译Android40源码图文
查看评论
1楼 木易小舟 2013-03-15 11:14发表 [回复]
谢谢, 文章被转载到:http://blog.csdn.net/acanoe/article/details/8676967
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
  • 访问:419507次
  • 积分:5477
  • 等级:
  • 排名:第1805名
  • 原创:113篇
  • 转载:11篇
  • 译文:7篇
  • 评论:322条

[转载]have you declared this activity in your AndroidManifest.xml? - Neo的日志 - 网易博客

mikel阅读(849)

[转载]have you declared this activity in your AndroidManifest.xml? – Neo的日志 – 网易博客.

I/ActivityManager( 1128): Displayed com.Android.settings/.WirelessSettings: +1s116ms

I/ActivityManager( 1128): Starting: Intent { act=Android.intent.action.MAIN cmp=com.rockchip.ethernetsettings/.EthernetSettings } from pid 2371

D/AndroidRuntime( 2371): Shutting down VM

W/dalvikvm( 2371): threadid=1: thread exiting with uncaught exception (group=0xa00194f0)

E/AndroidRuntime( 2371): FATAL EXCEPTION: main

E/AndroidRuntime( 2371): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.rockchip.ethernetsettings/com.rockchip.ethernetsettings.EthernetSettings}; have you declared this activity in your AndroidManifest.xml?

E/AndroidRuntime( 2371):     at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1404)

E/AndroidRuntime( 2371):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1378)

E/AndroidRuntime( 2371):     at android.app.Activity.startActivityForResult(Activity.java:2827)

E/AndroidRuntime( 2371):     at android.app.Activity.startActivity(Activity.java:2933)

E/AndroidRuntime( 2371):     at android.preference.Preference.performClick(Preference.java:828)

E/AndroidRuntime( 2371):     at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:190)

E/AndroidRuntime( 2371):     at android.widget.AdapterView.performItemClick(AdapterView.java:284)

E/AndroidRuntime( 2371):     at android.widget.ListView.performItemClick(ListView.java:3513)

E/AndroidRuntime( 2371):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:1800)

E/AndroidRuntime( 2371):     at android.os.Handler.handleCallback(Handler.java:587)

E/AndroidRuntime( 2371):     at android.os.Handler.dispatchMessage(Handler.java:92)

E/AndroidRuntime( 2371):     at android.os.Looper.loop(Looper.java:123)

E/AndroidRuntime( 2371):     at android.app.ActivityThread.main(ActivityThread.java:3647)

E/AndroidRuntime( 2371):     at java.lang.reflect.Method.invokeNative(Native Method)

E/AndroidRuntime( 2371):     at java.lang.reflect.Method.invoke(Method.java:507)

E/AndroidRuntime( 2371):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)

E/AndroidRuntime( 2371):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)

E/AndroidRuntime( 2371):     at dalvik.system.NativeStart.main(Native Method)

W/ActivityManager( 1128): Force finishing activity com.android.settings/.WirelessSettings

W/ActivityManager( 1128): Activity pause timeout for HistoryRecord{a0674e28 com.android.settings/.WirelessSettings}

D/dalvikvm( 1128): GC_CONCURRENT freed 698K, 47% free 4162K/7751K, external 1639K/1975K, paused 12ms+12ms

I/Process ( 2371): Sending signal. PID: 2371 SIG: 9

I/ActivityManager( 1128): Process com.android.settings (pid 2371) has died.

 

其中解决问题的关键在于

E/AndroidRuntime( 2371): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.rockchip.ethernetsettings/com.rockchip.ethernetsettings.EthernetSettings}; have you declared this activity in your AndroidManifest.xml?

这个信息。寻找项目对应的AndroidManifest.xml,这个文件存在且正确。而且com.rockchip.ethernetsettings.EthernetSettings这个类的代码也在。

这 个错误信息可以理解为,android编译之后会将所有的AndroidManifest.xml组成一个表,在点击相应item的时候触发响应的过程是 通过item的name去这个表中找相应的类名,找到类名后,就调用这个类。而以上出错信息提示未找到这个类。怀疑这个类是否真的被编译进镜像了。查看 android.mk文件,

ifeq ($(strip $(USE_ETHERNET)),true)

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := eng

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := EthernetSettings

LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)

endif

发现第一行的宏并没有被定义,在适当的地方添加即可。这里在device/seuic/tiger_mb/device.mk中添加如下:

# Ethernet +++

USE_ETHERNET := true

# Ethernet —

重新编译,问题解决。

[转载](2)Android程序的Unable to instantiate activity ComponentInfo异常_iechenyb_新浪博客

mikel阅读(1015)

[转载](2)Android程序的Unable to instantiate activity ComponentInfo异常_iechenyb_新浪博客.

今天写程序,一直被java.lang.RuntimeException: Unable to instantiate activity ComponentInfo异常困扰,查看LogCat也没有我自己写的文件异常抛出,一直不明白是怎么回事,后来上网搜了搜,看到大家都觉的是这些可能:

It is a problem of your Intent.

Please add your Activity in your AndroidManifest.xml.

When you want to making new activity, you should register it in your AndroidManifest.xml.

意思是已经写好了Activity这个类并且想通过Intent传递以便切换Activity,但是并没有在Manifest.xml文件中添加这个Activity,导致不能实例化Activity。

In my case I forgot to add the google maps library

uses-library Android:name=”com.google.android.maps”

it may be useful to someone: http://developer.android.com/resources/tutorials/views/hello-mapview.html

Also, check that you’re not missing the preceding dot before the activity path

< activity android:name=”.activities.MainActivity”/>

这个意思是类的路径写的不对(比如说一个Activyty在com.j2men包里,一个在com.j2men.ui包里,这时在Manifest中默认 定义的package是com.j2men,如果你写一个新的Activity进去时,就得在.类名前面再加上.ui才行)或者在 Manifest.xml中android:name=”.类名”这里的类名前忘加了那个点。

There is another way to get an java.lang.RuntimeException: Unable to instantiate activity ComponentInfo exception and that is the activity that you are trying to start is abstract. I made this stupid mistake once and its very easy to overlook.

这个人说的意思是如果你把默认intent的Activity定义为抽象类的话,也会弹出这种错误。

如果这三种情况你都考虑到了,并且也做了相应的修改后依然抛出这个异常,还有一招:你去看看你要打开的那个Activity类里是否同时存在构造函数和onCreate()方法,如果是的话请把构造函数删除试试。把初始化放在onCreate()方法里进行。

联网程序如果获取不到数据的时候,检查一下Manifest.xml里面是否忘记添加了网络权限的语句:

< uses-permission android:name=”android.permission.INTERNET” />

[转载]eclipse使用技巧之代码编辑器分隔窗口_安索帕与Google Wildfire宣布全球协作_脚本百事通

mikel阅读(836)

[转载]【原创】eclipse使用技巧之代码编辑器分隔窗口_安索帕与Google Wildfire宣布全球协作_脚本百事通.

【原创】eclipse使用技巧之代码编辑器分隔窗口

相信很多使用Intellj IDE的朋友对其split screen功能赞赏有加!其实在eclipse中也可以方便地代码编辑多windows、多views!但是隐藏的有点深,很多朋友不常用到,甚至以为 eclipse不支持。。。搜索引擎也很少相关的设置技巧,下面介绍下如何设置。

1、在需要split的editor tab页上右键New Editor,如图:

2、鼠标拖拽新建的Editor至左侧或右侧停靠,如图:

PS:也可以从菜单里的New Window,建立新的eclipse窗口,在多个窗口打开同一文件

Android开发者主流的盈利模式

mikel阅读(990)

目前移动互联网产品的主流盈利模式大概可以分为三类:广告、IAP、Freemium。这三种盈利模式有各自的特点,在针对的收费人群以及收费策略上也各有不同。
广告
应用内嵌入广告的盈利模式可以说是移动互联网产品使用的最普遍的一种盈利模式了,我们见到的一部分应用和大部分游戏均采用这种盈利模式。应用内嵌入广告的 模式操作起来相对简单,只要将广告条放置在应用界面的固定位置(通常是顶部或底部)即可。同时,不同的应用还提供了不同的去广告方式。有通过付费下载去广 告版应用来实现向厌烦广告的一部分用户收费的目的,
应用内嵌广告的方式缺点非常明显。内嵌广告质量参差不齐;大多数广告与应用本身并不存在任何联系;内嵌广告占用了用户的可视空间,影响了用户体验;盈利效果并没有想象中的那么好。
应用外嵌广告的方式相对而言优点就非常明显:内嵌广告质量非常高;大多数广告与应用本身存在微妙的联系;在应用外面显示,不影响用户对游戏本身的体验。最近很多移动广告平台都在做应用外嵌广告,比如聚米移动广告平台,酷果移动广告平台等。
IAP(In-App Purchase)
IAP(应用内购买)的模式更多见于手机游戏中,提供购买的也基本上是游戏中需要花费的金币或其他消耗品。其他也有应用尝试采用IAP的盈利模式, 前一阵 App Store 应用推荐榜上有名的 Repix 就是一个很典型的使用IAP盈利模式的应用。Repix 中初始包含了十分有限的一小部分滤镜画笔提供给用户进行体验,而更多的滤镜画笔包则设定为内购解锁的形式。内购模式的基本思路是在应用中将最基本的功能开 放给用户使用。一旦用户对应用的功能产生了兴趣或形成了初步的使用习惯之后,应用内的内购可为用户提供高级功能或附加特性的解锁服务。IAP 模式对用户的初期体验依赖非常强烈,如果开放的基本功能不能很好地吸引用户或给予用户较好的使用体验,很难再让用户进一步为这个应用花费更多金钱。

相比其它类型的应用,手机游戏使用 IAP 模式更为普遍,且效果相对来讲也更好。游戏相对来说可以更轻松地使特定用户群(即针对特定游戏类型的玩家)产生一定的黏性,同时也能更方便地利用游戏玩家 的心理和性格软肋,再设置适当的内购价格,效果会明显好于其他类型的应用。而工具类应用若不能很好地抓住用户的根本需求,提供的内购很难达到预期的效果, 甚至会遭到用户的诟病。IAP 模式可以为移动互联网公司带来一定的收益,但这种收益并不稳定,效果也不尽如人意。
Freemium
所谓 Freemium 模式,意思是通过一部分免费服务来吸引用户,而后通过提供增值服务,将一部分免费用户转化为付费用户。Freemium 模式最常见于网盘、邮件客户端、网络相册、云记事本以及网络电话等多种不同类型的互联网产品。这种模式的有点非常明显,免费服务可以在最大限度上给用户最 好的使用体验,即使是免费用户也可以很好地使用应用的绝大部分功能,当一部分免费用户产生了足够的黏性后,有更高需求的用户自然会转变为付费用户来享受增 值服务。Freemium 模式与 IAP 最大的区别就在于理念。IAP 试图通过限制较大部分的功能和附加属性来强迫用户付费,用户使用这类应用时会有一种被绑架的感觉;而 Freemium 遵循的是“二八定律”,即 80% 的用户均为免费用户,仅有 20% 或更少比例的高端用户会成为付费用户。通过一个较长的使用过程,让一部分用户在毫无压力或没有被强迫感的基础上自然地转变为付费用户,花钱购买增值服务。 因此这个使用这个模式的应用在初期有一个用户积累的过程,在这个过程中几乎没有付费用户产生。当用户量积累到一定程度的时候,使用习惯也基本形成了,此时 付费用户量才会开始增长。而仅仅是一小部分的付费用户为公司带来的收入即可弥补初期阶段提供免费服务带来的前期支出。

Evernote 作为成功应用 Freemium 模式的最典型案例,为互联网公司树立了很好的榜样。用户可以免费使用 Evernote 的绝大部分功能,但云端空间拓展以及诸如移动设备密码保护等高级增值功能需要付费使用。Evernote 的付费用户比例并不高,但单月收入已经让很多互联网公司望尘莫及了。Freemium 模式目前被普遍认为是一种较好的互联网公司盈利模式,同时也是最适合移动互联网特点的一种盈利模式。
钱还能怎么赚
由于受到移动互联网的特性的影响,针对移动互联网的盈利模式也受到了一定的限制。在屈指可数的几种盈利模式面前,互联网公司真的没有其他的选择了吗?下面有两种思路,虽然并不一定适合所有类型的移动互联网产品,但若能引发我们的思考,或许可以从中得到一些启发。
长期以来,移动端产品带来的收入大部分都来自于用户,也就是说用户需要为自己得到的一些服务付出金钱。而如果换一种思路,让用户得到一些而不是失去一些, 同时从其它渠道得到收入,这样既能让用户更容易接受,个人开发者也可以从中盈利。只要选择了对的广告平台和适合自己应用的广告模式,收益还是非常可观的。

从支付宝刷脸想到的规模效应

mikel阅读(1207)

马云在汉诺威CeBIT展开幕式上演示了刷脸支付技术,通过人脸识别替代密码完成支付。从刷脸可以看出支付宝也是蛮拼的,想尽各种办法提高用户体验,让支付更简单轻松,从过去被老马骂哭的产品经理那可以看出老马对支付宝的用户体验差简直是零容忍。

那么多人用支付宝,支付宝就简直是个能下金蛋的金鹅,几天前写过一篇《资金沉淀的力量有多恐怖?》的文章说道支付宝,其实就是积沙成塔的道理,很多人看了后说那些都是BAT等大公司才能做到的事儿,今天就仔细的想了想,其实很多人已经变相的做到了资金沉淀,而且都是草根站长,他们是怎么做的,就是建站,疯狂的建站,一天建10个网站,然后互相链接,互相推广,然后网站上投放广告,每天更新文章提高搜索引擎排名,然后等着排名上去每个站的广告联盟收入尽管很低也就一天几块钱,可是他可以建成千上万的网站,这样每天的收入就很恐怖而且有这么多网站资源做推广和营销就更加容易,就好比手里面掌握着好几万的外链资源想要推广某个网站轻松就可以搞定。

于是再发散思维想到了体验站的规模效应,体验站是靠会员做任务赚钱联盟佣金的方式盈利的,当前的体验站很多,大多数都是个人站长建站,推广营销也不少,每天收益也不错,如果按照上面的思路,每天建1个体验站,365天就是365个体验站,然后纷纷接入各个任务联盟,尽管1个站的每天收益不多,如果成了规模365个体验站每天的收入可就是恐怖了,互联网的特点就是复制很容易,程序和数据都可以复制,copy一份就是一个新网站,这就是为什么常常看到有高人晒自己建了几千个网站的每日收入让人瞠目结舌,就是这个道理,算了一笔账刨去服务器和域名的费用,就是人工成本和日常运营的费用了,关键还在执行上。

从此可见任何东西成了规模,都是恐怖的!当你发现有个项目能每天赚1分钱,你就使劲的想它变成几十万规模看看每日收入多少,如何运作想办法就好了。

kiwi logo