“联系人管理器”应用 一、构建解决方案 Visual Studio为我们提供了专门用于创建ASP.NET Web API应用的项目模板,借助于此项目模板提供的向导,我们可以“一键式”创建一个完整的ASP.NET...对于IDE提供的这种旨在提高生产效率的自动化机制,我个人自然是推崇的,但是我更推荐读者朋友们去了解一下这些自动化机制具体为我们做了什么?做这些的目的何在?哪些是必需的,哪些又是不必要的?...在该类型中,我们定义了Get、Post、Put和Delete这4个Action方法,它们分别实现了针对联系人的查询、添加、修改和删除操作。...Action方法Get具有一个表示联系人ID的可缺省参数,如果该参数存在则返回对应的联系人,否则返回整个联系人列表。...MVVM可以看成是MVC模式的一个变体,Controller被View Model取代,但两者具有不同的职能,三元素之间的交互也不相同。
用户:指的是咱们班的每一个同学。 角色:指的是咱们班同学的身份信息。 比如 A 同学,它是我的学生,其中有个身份就是学生,还是家里的孩子,那么他还有个身份是子女。...同时 B 同学,它也具有学生和子女的身份。 那么任何一个同学都可能具有多个身份。同时学生这个身份可以被多个同学所具有。 所以我们说,用户和角色之间的关系是多对多。...它利用类与类之间的关系来检索对象。 例如:我们通过 ID 查询方式查出一个客户,可以调用 Customer 类中的 getLinkMans()方法来获取该客户的所有联系人。...6.1.2 对象导航检索示例 查询一个客户,获取该客户下的所有联系人 /** * 需求: * 查询 ID 为的 1 客户有多少联系人 */ @Test public void test1(...在 JPA 中提供了两个方法。
可以扩展(有一些努力) 使用一个强声明性语言查询 提供足够的支持,专业技能和工具。...,不需要验证 保证更新一个文档 - 但不是多个文档 提供出色的性能和可伸缩性 使用 JSON 数据对象查询 是一个新的、令人兴奋的技术。...你比我更了解你的项目,我不建议切换从SQL到NoSQL或反之亦然,除非它提供了可观的效益。这是你的选择。在项目的开始要考虑利弊,你不能出错。...region zipcode country 我们原来的 contact 表简化成: id title firstname lastname gender 太棒了——我们有了一个能存放任意联系人的任意多个电话号码...我希望这些场景有所帮助,但是每个项目是不同的,最终,你需要做出自己的决定。(虽然,我们开发人员擅长于证明我们的技术选择,不管他们有多好!) 最好的建议:显露你自己尽可能多的技术。
零、前言 [1].顾名思义,内容提供者,目的:实现跨进程间数据共享 [2].基于数据库提供数据 [3].如电话簿,短信,歌曲信息都是以数据库存储存储,都可以通过ContentProvider获取...[4].不太熟悉安卓运行时权限的童鞋可以看一下我封装的权限申请类: TI--安卓运行时权限完美封装 [5].如果只是想使用的人,直接把静态方法拷贝即可,想知道原理的,图片和注释认真看一下,也可以自己分析一下联系人的表...下,根据contact_id查询data表字段, 然后判断mimetype的值,新建实体类,将数据设置到实体中, 将实体放入实体集合,查完返回集合。...联系人数据库 ? 联系人.png 我们关注的时三张表: 1.raw_contacts 关注一个字段contact_id ?...转载请注明 更多安卓技术欢迎访问:https://www.jianshu.com/c/004f3fe34c94 张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com 你的喜欢与支持将是我最大的动力
第二层:RawContracts层,由Data层的多条数据组合成一个完整的联系人信息。 第 三层:Contracts层,这一层主要注意与第二层的区别。...大部分情况下这两层的数据时指同一个联系人的信息,即他们俩是一一对应的关系,但是有些特殊 情况,这个我是查了一些老外的论坛加上自己的理解,例如 我做一个本地通信录和网络上的通信录同步的时候,可能有一个人他在本地存在...(这种情况我没有试出来,我感觉这个其实是Android创造了这个概念之后,留给我们开发自己去实现的。) 开发主要用到前两层 contacts.db中三个比较重要的表: 1....该表保存了联系人的RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添加到收藏夹、显示的名字、用于排序的汉语拼音等信息。...Ø 联系人的所有信息保存在列data1至data15中,各列中保存的内容根据MimeTypeID的不同而不同。
的时候就被废除了,那么现在要在不同的Android程序之间共享数据的话就只能通过ContentProvider(内容提供器)来实现了(排除你是黑客的前提下)。...类的对象, 之后,我们就可以通过ContentResolver类提供的一些方法对数据进行 增加、更改、删除、查询 操作(和数据库的4个操作类似)。...,第三第四个参数是要查询的数据满足的条件, 第五个参数是查询结果的排序方式 下面通过一个小例子来理解: 通过ContentProvider来读取联系人信息并且建立自定义的ContentProvider...,对应于获取联系人信息事件,一个ListView用于显示联系人的信息。...Uri,来查询联系人信息,类似于数据库的查询方法。
该页面初始状态如左图所示,它仅仅具有一个用于输入查询条件(First Name和Last Name)进行联系人查询的表单。...当用户输入相应的查询条件之后点击“Retrieve”按钮,相应的联系人列表显示以表格的形式显示出来(中图)。...QueryFormPartial.cshtml定义了一个以Ajax方式提交的表单,目标Action为具有如下定义的Find,它根据指定的First Name和Last Name筛选匹配的联系人列表,并将其呈现在一个名为...”对话框 从ContactListPartial.cshtml的定义可以看到联系人ID以一个链接的方式呈现出来,点击该链接会以Ajax的方式访问Action方法Update,当前联系人ID会作为请求的参数...如下所示的是Action方法Update的定义,它根据指定的ID获取对应的联系人,并将其呈现在一个名为ContactPartial 的View中。
这种倾斜的船身,是当时的画家常用的手法,用于表现很强的风。 ? 描述 上一讲实现了一个类别条目页面。现在,我希望点击某个类别后,能再次以条目的方式显示所有的联系人。...新的数据库查询方法 我将增加一个条目页面,用于显示某个类别下的所有联系人。在数据层面上,我需要从数据库中取出某个类别下的所有联系人。...我在数据库的query()方法中规定,在数据库查询时,将只保留符合KEY_CATEGORY_ID等于categoryId条件的数据记录。...在Intent放入附加数据 我希望点击类别后,能够进入显示该类别所有联系人,即启动一个新的联系人条目页面。由于类别的数目是动态变化的,我不可能为每个类别创建一个下游页面(而且这样也太麻烦了)。...然而,我可以把类别信息传递给同一个下游页面,让该下游页面根据类别,进行不同的处理。这个数据传递的任务,将由Intent完成。从概念漫游(上)中,我们已经知道,Intent就像传令兵。
内容提供是实质上是个接口,后门,他给别人提供数据,系统联系人是个比较复杂的内容通过者。...-journal,这个文件和数据库的事务相关 联系人应用数据库的主要结构 raw_contacts 联系人表 contact_id 联系人id data数据表 raw_contact_id联系人id,...mimetype_id数据类id,data1数据 mimetypes类型表 1 email,5 phone,7 name 查询所有的联系人信息: 查询raw_contacts表把联系人id取出来 根据id...查询data表,把所有的数据取出来 根据数据的mimetype_id查询mimetypes表获取数据的业务类型 查询系统源代码,找到providers/Contacts相关的,先找清单文件,看到 注意:如果一个账号被删除了,他不是真正的删除而是把raw_contacts表里面的contact_id写为null了,查询的时候应该加个判断是否为空
它需要提供一个通道 ID,以便websockets 服务能够将通知正确地路由回正确的浏览器: 为通知打开 websocket “通道” 其次,浏览器需要向作业服务发送CSV 格式的联系人的 HTTP...它比配置数据更适合更大的数据集。 另一种方法是拥有一个内存中的键/值缓存,它也具有持久性——Redis AOF提供了这种能力。...Kafka 以压缩主题的形式为键/值存储提供了类似的解决方案(其中保留模型确保不会删除键的最新值)。...这就是为什么即使出现临时错误(例如,第三个支付提供商不可用),续订最终也会成功很重要。...幸运的是,Kafka 为这种流水线事件流提供了一个解决方案,其中每个事件只处理一次,即使服务有一个消费者-生产者对(例如 Checkout),它既消费一条消息又产生一条新消息。
明确一下今天我们写的这个程序的目的(也就是我的作业题): 通讯录管理软件。 通讯者信息包括:姓名、性别、手机、Email、地址。 软件功能:添加、查询、删除、全部输出。 ...3.接下来就可以等待用户的输入了,我们可以给用户一些选择,比如选1表示要添加联系人,选2表示删除联系人,选3表示查询联系人。这个就一个swich语句完了,我就不发代码了。 ...我们这个函数将sql语句编译成二进制字节码,以便后面的函数使用,编译好的东西就是stmt(第五个参数)。别问我为什么,我也不知道,但要执行sql来查询就要编译。...8.到现在,我们已经完成了3个任务了,添加联系人、查询联系人、列出所有联系人,最后再写一个删除联系人的函数就完成任务了: void DelPerson(sqlite3 * db) { int n;...9.总结 这个题目写完了,我也介绍了一些常用的sqlite3的API,并没有想象中那么复杂。这是运行的截图,代码我不发了,如果想要可以联系我。 ?
,要了解的是这是内容提供者(contentProvider)的知识点,大家都知道数据库是在data-->data 对应的包目录下,其他应用是不可以访问到的,如果有些数据要提供给其他的应用,比如通信录,其他应用想获取它的数据怎么办呢...,这时内容提供者就出现了,预先写好了一些操作数据库的方法,因为方法是开发这个应用的开发者提供的,所以保证了数据库的安全操作,又能共享数据。...获取联系人就比较复杂了,其表结构也比较复杂,我们获取联系人的姓名、电话号码、邮箱,要通过3张表去提取 数据库所在位置data-->data中的下面路径 ?...条件为ContactsContract.CommonDataKinds.Phone.CONTACT_ID = 上面查询到的ID */...条件为ContactsContract.CommonDataKinds.Phone.CONTACT_ID = 上面查询到的ID */
一、 基于IoC的HttpControllerActivator 将IoC应用于HttpController激活系统的目的在于让一个预定义的IoC容器来提供最终的HttpController对象。...简单起见,我们只定义了唯一的Action方法Get用于获取联系人信息。该方法具有一个可缺省的参数id表示希望获取的联系人的ID,如果没有提供此参数则返回所有联系人列表。...EmailAddress { get; set; } 21: public string Address { get; set; } 22: } Action方法利用Repository属性返回的对象来实施联系人的查询工作...我们利用IContactRepository接口来抽象对联系人数据的存储,如下面的代码片断所示,我们在此接口中仅定义了唯一的GetContacts方法根据指定的添加来筛选对应的联系人列表。...(“/api/contacts”)和针对某个ID为“001”(“/api/contacts/001”)的联系人信息,相应的联系人信息会以如下图所示的形式出现在浏览器上。
说道这,很多读者可能想到WCF中不是早都有了REST风格的服务么,为什么还需要这个WebAPI?...关于这一块,有一个问题困扰了我很久,就是KnockoutJS和AngularJS谁的适用性更强,其实它们没有可比性,KnockoutJS只提供了部分的工作。...以下链接是对此问题的解释,结论是我将学习并使用AngularJS。...http://blog.darkthread.net/post-2014-06-07-go-to-angularjs.aspx 说到这,我还想到了学习中的一个困惑,那么多的IOC框架到底哪个相对更好一些...等验证器,需要注意的是该框架中验证过程是递归的,与MVC有点不同。
spec); //查询列表 //查询全部,分页 //pageable:分页参数 //返回值:分页pageBean(page:是springdatajpa提供的) Page findAll...* 自定义查询条件 1.实现Specification接口(提供泛型:查询的对象类型) 2.实现toPredicate方法(构造查询条件) 3...i.一对多操作 案例:客户和联系人的案例(一对多关系) 客户:一家公司 联系人:这家公司的员工 一个客户可以具有多个联系人 一个联系人从属于一家公司...联系人:在联系人的实体类中包含一个客户的对象 4.配置映射关系 * 使用jpa注解配置一对多映射关系 级联: 操作一个对象的同时操作他的关联对象...3.cascade(配置级联) 级联添加, 案例:当我保存一个客户的同时保存联系人 级联删除 案例:当我删除一个客户的同时删除此客户的所有联系人
那么接下来我们就一个一个开始学习吧,首先从使用现有的内容提供器开始。 如果一个应用程序通过内容提供器对其数据提供了外部访问接口,那么任何其他的应用程序就都可以对这部分数据进行访问。...Android系统中自带的电话簿、短信、媒体库等程序都提供了类似的访问接口,这就使得第三方应用程序可以充分地利用这部分数据来实现更好的功能。 下面我们就来看一看,内容提供器到底是如何使用的。...内容URI 不同于SQLiteDatabase,ContentResolver中的增删改查方法都是不接收表名参数的,而是使用一个Uri参数代替,这个参数被称为内容URI。...path path则是用于对同一应用程序中不同的表做区分的,通常都会添加到authority的后面。...现在我们就可以使用这个Uri对象来查询tablel表中的数据了,代码如下所示: Cursor cursor =getContentResolver().query( uri, projection
消息内容表用于存储消息维度的一些基本信息,比如: 消息ID 消息内容 消息类型 消息产生时间 收发双方的两个索引表通过同一个消息ID和这个内容表关联。...假设张三给李四发送一条消息,消息存储在MySQL,那么上面涉及的两张表大致如下: 内容表 索引表 张三给李四发了一条“你好”,该动作会向内容表存储一条消息,消息内容: ID为1001,消息内容是“你好...联系人列表只更新存储收发双方的最新一条消息,不存储两人所有的历史消息 消息索引表的使用场景一般用于查询收发双方的历史聊天记录,是聊天会话维度 联系人表的使用场景用于查询某一个人最近的所有联系人,是用户全局维度...联系人的对方UID为李四的UID,和这个联系人最新的一条消息ID是1001 有过聊天记录 则只需更新张三和李四的最新的一条聊天消息ID为1001,同样的办法再更新一次李四的联系人列表 2 消息收发通道...上面通过未读提醒来查看消息的环节中涉及了两个概念:一个是我有多少条未读消息,另一个是我和某个联系人有多少条未读消息。
“显示估计执行计划”选项立即显示所选TSQL代码的查询计划图,而不执行查询。 “包括实际执行计划”按钮是一个开关,一旦您选择了此选项,您执行的每个查询批次都将显示新查询计划图表以及结果和消息。...这个计划的每个操作的相对成本告诉我们,排序操作是总成本的5%,而表扫描是95%的工作。 因此,如果我们想提高这个查询的性能,我们应该解决表扫描,而不是排序; 这就是为什么建议索引。...新的非聚集索引(索引键为Suffix)具有“WHERE Suffix ='Jr.”条目聚集在一起; 因此,检索数据所需IO的减少。...图4 - 一个并行查询计划 新的计划也向我们展示了联系人行数的增加,导致匹配和排序操作成为此查询的关键路径。如果要提高绩效,就要先攻击这两个行动。再次,包含列的索引将有所帮助。...预分类 索引是您预测数据的方式;即以经常需要的顺序向SQL Server提供数据。这就是为什么创建非聚簇索引(每个都包含列)都使我们以前的例子受益。
ContentResolver和URI来访问应用A中的ContentProvider了。...二、调用系统的ContentProvider 除了我们自己创建ContentProvider,Android系统也给我们提供了丰富的ContentProvider接口,这里就以操作系统的联系人为例来说明一下怎使用系统提供的...1、查询系统联系人 通过系统联系人的Uri获取系统联系人及手机号码: public void query() { showContact = ""; // 获取联系人的Cursor集合...当然,除了以上几个Uri,系统的ContentProvider接口还有很多很多,就不一一举例了,用到时可以查询官方API。...不妨关注我一起学习,互相探讨,共同进步!
领取专属 10元无门槛券
手把手带您无忧上云