Room使用笔记,关于标签管理连串

By admin in 4858.com on 2019年2月12日

在做项目标进程中,我们日常索要利用过滤一些html标签来贯彻抓牢多少的安全性,其实就是删除这些对应用程序有秘密危机的数量。它用于去除标签以及去除或编码不须要的字符。
先是分享部分相比广泛的

1.在主线程中应用Room操作数据

Room暗中认同不许在主线中对数据库中的数据进行增删查改等操作,我们需求将操作放在异步线程中去实践,不过有时我们在数据库中存的只是微量的数量,每一回都选用线程来开展操作显得太劳苦,那么就必要安装Room可以在主线中开展操作。
骨子里要在主线程中采用Room很粗略,只须要在build数据库对象时选拔allowMainThreadQueries()方法即可

TestRoomDatabase trdb = Room.databaseBuilder(context, TestRoomDatabase.class, "test.db")
                            .allowMainThreadQueries()
                            .build();

原文地址:关于标签管理序列作者:4858.com
songguiliang

 

$str=preg_replace("/<s*imgs+[^>]*?srcs*=s*('|")(.*?)\1[^>]*?/?s*>/i","", $str); //过滤img标签  

$str=preg_replace("/s+/","", $str); //过滤多余回车  

$str=preg_replace("/<[ ]+/si","<",$str); //过滤<__("<"号后面带空格)  

$str=preg_replace("/<!--.*?-->/si","",$str); //注释  

$str=preg_replace("/<(!.*?)>/si","",$str); //过滤DOCTYPE  

$str=preg_replace("/<(/?html.*?)>/si","",$str); //过滤html标签  

$str=preg_replace("/<(/?head.*?)>/si","",$str); //过滤head标签  

$str=preg_replace("/<(/?meta.*?)>/si","",$str); //过滤meta标签  

$str=preg_replace("/<(/?body.*?)>/si","",$str); //过滤body标签  

$str=preg_replace("/<(/?link.*?)>/si","",$str); //过滤link标签  

$str=preg_replace("/<(/?form.*?)>/si","",$str); //过滤form标签  

$str=preg_replace("/cookie/si","COOKIE",$str); //过滤COOKIE标签  
// http://www.manongjc.com/article/1345.html  
$str=preg_replace("/<(applet.*?)>(.*?)<(/applet.*?)>/si","",$str); //过滤applet标签  

$str=preg_replace("/<(/?applet.*?)>/si","",$str); //过滤applet标签  

$str=preg_replace("/<(style.*?)>(.*?)<(/style.*?)>/si","",$str); //过滤style标签  

$str=preg_replace("/<(/?style.*?)>/si","",$str); //过滤style标签  

$str=preg_replace("/<(title.*?)>(.*?)<(/title.*?)>/si","",$str); //过滤title标签  

$str=preg_replace("/<(/?title.*?)>/si","",$str); //过滤title标签  

$str=preg_replace("/<(object.*?)>(.*?)<(/object.*?)>/si","",$str); //过滤object标签  

$str=preg_replace("/<(/?objec.*?)>/si","",$str); //过滤object标签  

$str=preg_replace("/<(noframes.*?)>(.*?)<(/noframes.*?)>/si","",$str); //过滤noframes标签  

$str=preg_replace("/<(/?noframes.*?)>/si","",$str); //过滤noframes标签  

$str=preg_replace("/<(i?frame.*?)>(.*?)<(/i?frame.*?)>/si","",$str); //过滤frame标签  

$str=preg_replace("/<(/?i?frame.*?)>/si","",$str); //过滤frame标签  

$str=preg_replace("/<(script.*?)>(.*?)<(/script.*?)>/si","",$str); //过滤script标签  

$str=preg_replace("/<(/?script.*?)>/si","",$str); //过滤script标签  

$str=preg_replace("/javascript/si","Javascript",$str); //过滤script标签  

$str=preg_replace("/vbscript/si","Vbscript",$str); //过滤script标签  

$str=preg_replace("/on([a-z]+)s*=/si","On\1=",$str); //过滤script标签  

$str=preg_replace("/&#/si","&#",$str); //过滤script标签  

2.Room对数据库进行版本升级

在采纳SQLiteOpenHelper时我们得以在onUpgrade中来进行数据库的升官操作。那么使用Room时如何做呢?首先vision版本+1,然后在相应实体类中添加必要追加的字段(数据库表伸张字段)恐怕创立一个新的实体类(扩展一张表)并援引这一个实体。是还是不是这样就足以了呢?可是并不是,大家须要对新增的字段大概新增的表执行相应的SQL语句才能对数据库举行我们需求的改动,那在Room中怎么去履行那些言辞呢?Migration能够成功大家的须要。

Migration的创建,其中1和2表示vision从1升级到2

private Migration mMigration_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
                //TODO 执行对应的SQL语句
        }
    };

Migration的使用

TestRoomDatabase trdb = Room.databaseBuilder(context, TestRoomDatabase.class, "test.db")
                            .addMigrations(mMigration_1_2)
                            .build();
//同样可以添加多个
1、addMigrations(mMigration_1_2, mMigration_2_3,...)
2、addMigrations(Migration数组)

一、标签管理体系系统

前言

本篇文章用于教学如何把地点的数额内容和伊夫rnote的多少开展同步。半数以上故事情节翻译自《伊芙rnote
Synchronization via EDAM
v1.0.5》,就文档而言应该是伊芙rnote官网上比较新的,是二〇一八年2月才出的。不过因为各类原因文档中的部分情节早已不合时宜,可能和API并不是完全符合,也有一对缺陷。所以在那不是一篇截然的翻译文,中间会加盟我个人的一对驾驭,也装有删除修改。本文内容根本是文档中的第三有些。其余附有四五有的的,助于领悟,因为就两张图,翻译成中文后反而不便宜。文档的前两片段紧即使有的简介,阅读本文必须持有一些必不可少的准备知识(如伊夫rnoteAPI的中坚使用),文档的前两有些就平素不太大意思。有必不可少的地点我会尽量也写出来。关于文档的终极一片段,有关链接笔记的故事情节,因为我个人临时并未索要,所以就从未翻译了,而且有关链接笔记经常在利用伊芙rnote的时候本人也未尝太多拔取,没有啥样认识,就不敢乱写。最重点的是,在那篇文章之后我会在发一篇《伊芙rnote
Sync Via EDAM
(代码篇)》,讲解自身在程序中落到实处的一头功效。不幸的是真的落到实处代码和这一篇的驳斥有很大脱节,有诸多缘故,具体我在那篇的下结论和下一篇小说中会具体涉及。

最后交给《伊芙rnote Synchronization via
EDAM》的下载地址

 

更简明些的写法:

3.Room基于条件删除

Room中Dao暗中同意提供的Delete标签完成如下:

@Delete
void delete(Test test);
@Delete
void delete(List<Test> tests);

经过上述措施大家不得不删除大家传入的照应对象的关键字多对应的数额,若是我们须要依照某个条件来删除的话以上措施的兑现就不太友好(只可以先摸清符合要去除条件的目的,然后再调用以上的办法进行删除);那么有没有更好的兑现方式吧?其实Dao中还有@Query标签,即使看起来标签是用以查询数据的,然而使用该标签可以进行自定义的SQL语句的性状,我们一样能够应用该标签来执行大家的删减语句。

假设test表中有count字段,大家要刨除所有count等于某个值的数据,达成如下:

@Query("DELETE FROM test WHERE count = (:count)")
void deleteByCount(int count)

中间(:count)表示对传播参数的引用,左右括号可以毫无。

骨子里有了@Query标签,我们可以实施任意的SQL语句来已毕不一样的须求。

标签管理连串包括标签管理和贴标签两大功效模块,6个子模块。接下来大家将对种种成效模块的创设,进行详尽表达。

预备知识

清楚伊芙rnote中的基本要素概念,包蕴笔记(Note)台式机(Notebook)标签(Tag)资源(Resource)搜索记录(SavedSearch)等等。

行使基本的伊芙rnoteAPI,清楚UserSrore和NoteStroe,这几个局部当然是参考和,翻看实例代码是个很不错的路径

Room使用笔记,关于标签管理连串。USN(Update Sequence
Number)这一个是全方位同步系统中最重大的事物。他用于标识账户中的每三次修改。每趟修改后账户的USN就会+1.每种对象(台式机,笔记,标签,等等所有的东西)都会有一个USN,标识着一个对象最终一回被改动时的账户USN。那边有点糟糕领会。举一个例证。在某一个时时账户的USN是100.自身添加一个笔记Note1,那么账户的USN会变成101,Note1的USN也是101.然后我再添加一个笔记Note2,那时账户的USN会变成102,Nnote2的USN也是102,Note1的依旧101.那样一来大家每回同步后记录一下及时账户的USN保存为LastUSN,下次一块的时候,假诺账户的USN>LastUSN,表达账户中有东西被涂改了。对于逐个目的,比如Note1的USN>LastUSN表明服务器端的Note1被修改了。

function delhtml($str){  //清除html标签  
$st=-1; //开始  
$et=-1; //结束  
$stmp=array();  
$stmp[]=" ";  
$len=strlen($str);  
for($i=0;$i<$len;$i++){  
  $ss=substr($str,$i,1);  
  if(ord($ss)==60){ //ord("<")==60 http://www.manongjc.com/article/1345.html  
  $st=$i;  
  }  
  if(ord($ss)==62){ //ord(">")==62  
  $et=$i;  
  if($st!=-1){  
   $stmp[]=substr($str,$st,$et-$st+1);  
  }  
  }  
}  
$str=str_replace($stmp,"",$str);  
return $str;  
} 

4858.com 1

 

多少个名词的解释

去除(delete)在指把笔记移动到回收站(Trash),依然得以获取的笔记的只可是获取到的笔记的Active属性为False

扫除(Expunge)约等于永久性删除,对于笔记有活动到回收站和永久性删除的分别,而任何对象都只有永久性删除。

再来一个:

图1 标签管理连串系统图

同步操作的伪代码

转眼间的伪代码用于演说客户端与服务端同步的有的

function clear_html_label($html)   
{   
$search = array ("'<script[^>]*?>.*?</script>'si", "'<[/!]*?[^<>]*?>'si", "'([rn])[s]+'", "'&(quot|#34);'i", "'&(amp|#38);'i", "'&(lt|#60);'i", "'&(gt|#62);'i", "'&(nbsp|#160);'i", "'&(iexcl|#161);'i", "'&(cent|#162);'i", "'&(pound|#163);'i", "'&(copy|#169);'i", "'&#(d+);'e");   
$replace = array ("", "", "1", """, "&", "<", ">", " ", chr(161), chr(162), chr(163), chr(169), "chr(1)");  
return preg_replace($search, $replace, $html);   
}  

二、标签管理模块

服务端变量

updateCount  当前账户最新(最大)的USN

fullSyncBefore 
客户端执行增量同步如故完全同步的缓存截至时间。就是一个时光戳,这几个变量的值一般是有东西被从账户永久性删除的时间点,只怕是专擅客户端USN造成一部分服务器难点的时间点。

 

客户端变量

lastUpdateCount 上次一道获取的劳动器端的updateCount变量

lastSyncTime
上次一并的岁月(那几个日子是从服务器上取得的,相当于服务器时间,关于时间的代表难点,指出看一下,尤其是在.NET平台下开发的心上人,他的日子表示和DateTime差别。处理方法会在下一篇小说中付出。)

1.标签管理概念

认证

那边应该有个第1步的。但是这几个片段坑爹了,文档中的UserStroe.authenticate函数在前多少个月刚刚被扬弃,也等于说以后必须选择OAuth举行表明取得Token,因为本人临时还尚无弄好那一个难题。所以我后天仍然在使用DeveloperToken,具体内容可以参见

 

标签管理模块是指对用户视图库中的所有标签进行询问、修改、删除和新增等功用操作。主要包罗五个模块:标签树、标签查询。

一块状态

2 假如客户端平昔不曾和服务器同步过,就跳转到全然同步

3
使用NoteStrore.getSyncState(…)获取服务器端的updateCount和fullSyncBefore的值

a 如果fullSyncBrfore > lastSyncTime 跳转到一心同步

b 假使 updateCount = lastUpdateCount 表明服务器端没有更新过,跳转到
出殡改变

c 不然 就跳转到增量同步

  • 标签树:以树形结构表现标签之间的层级和逻辑关系,并且可以对随意层级的竹签名展开改动、新增和和删除(注:删除标签时,只有将最底部的子标签删除之后,才能去除其上边标签。即当父标签下的叶子标签为空时,才能去除该付标签)
  • 标签查询:对某一时间段内的标签举办查询,可以已毕自定义(模糊)查询及规范查询。除了能对标签名举行查询外,还是可以对该标签名下的用户数举行统计查询。

统统同步

4
使用NoteStore.getSyncChunk(…,afterUSN=0,maxEntries),从服务器获取第一块数据。那里要表达多少个东西。一个是数量,那里数据只具有的档次对象,但是针对于想笔记,资源那种大目标,那里值再次来到一些元数据,元数据包含Guid,Title等,而不蕴含Content,binary
resources那种很大的字段。借使是标签(Tag)搜索记录(SavedSearches)等等那种小目的,那么就会回来完整的目的。还有被永久性删除的靶子只回去GUID。二是有关七个参数的表明,服务器会回到USN>agterUSN的目的,可是最多再次回到maxEntries个。那就象征大家或许要求经过反复获取数据,并统一才能获得到全部的数额。下一小步就是落成这些工作。

a
要是上一步回去的Chunk对象的chunkHighUSN小于Chunk对象的updateCount.保存一下现行以此Chunk对象,并且呼吁下一个Chunk,通过反复实践NoteStroe.getSyncChunk(…,afterUSN=cunkHighUSN,..)

5
按梯次数据保存的四个Chunk对象(我们把那多少个Chunk对象集合称为同步块),来创设当前服务器的状态

a
为同步块里劳动器端的价签(tags)建立一个列表(以GUID为唯一标示符),搜索同步块,按顺序把标签添加到列表,从列表中移除被标记为永久性删除(expunged)的竹签(通过看guid)

  1.      i
    若是一个标签在服务器列表,但是不在客户端,那么把它添加到客户端的数据库。
  2.      ii 假如有同名标签,不过GUID差别,按以下步骤处理

          1
倘诺已存在的标签有脏标记(在地头被改动过),那么声明用户在服务器创制了一个标签,在客户端也离线的时候创造了一个同名的标签。这么些时候要求把她们联合,
或许报告争论,让用户决定怎样处理

          2 不然就把客户端的tag重命名一下

    iii 若是一个标签在客户端,可是不在服务端

          1
只要标签没有脏标记,大概一旦它此前已经有被上流传服务器过,就把它从客户端删除

          2 不然就认证那么些是客户端新建的,大家一会会上传它的

   iv 假使一个标签在客户端和服务器两边都设有

          1 如果她们有同一的USN 并且没有脏标记,那么他们是已经一同了的

          2
只要她们有相同的USN,不过客户端的有脏标记,那么他一会会被上盛传服务器的

          3
若是服务器端的标签有比较高的USN并且客户端从未脏标记,那就把客户端的竹签更新成服务端的规范(注意要拍卖同名顶牛)

          4
假设服务端有更高的USN,并且客户端有脏标记。表达它被两端都修改过了,可以尝尝联合或然报告冲突让用户决定吗

b 对寻找记录(SavedSearches)已毕均等的算法

c
对台式机(Notebook)完毕均等的算法,尽管在客户端删除一个台式机,那么要把它具有的笔记(Notes)和资源(Resources)也都剔除掉

d 对链接台式机(LinkedNotesbooks)已毕平等算法

e
对笔记(Note)落成平等算法,注意下面提到过的我们只拿到到了没有Content的元数据,所以还亟需选拔NoteSrore.getNoteContent(…)来得到笔记的完好数据。此外笔记的Title是允许重名的,所以就绝不顾虑同名龃龉

6
完毕了和服务器的数目统一,把服务器变量updateCount保存到lastUpdateCount,还有吗服务器的脚下岁月(currenttime)保存到lastSyncTime

7 转去发送改变

 

2.效能列表

增量同步

8 用第4步的主意拿到同步块,不过afterUSN要设置成lastUpdateCount

9 处理一起块中的列表在客户端添加恐怕更新数据

a
为一起块里劳动器端的价签(tags)建立一个列表(以GUID为唯一标示符),搜索同步块,按顺序把标签添加到列表,从列表中移除被标记为永久性删除(expunged)的标签(通过看guid)

  1. i
    倘使一个标签在服务器列表,然则不在客户端,那么把它添加到客户端的数据库。
  2. ii 如若有同名标签,不过GUID差异,按以下步骤处理

    1
假如已存在的价签有脏标记(在本地被改动过),那么注解用户在服务器创制了一个标签,在客户端也离线的时候创制了一个同名的价签。这几个时候要求把她们联合,
或许报告顶牛,让用户决定如何处理

     2 不然就把客户端的tag重命名一下

iii 假如一个标签在客户端和服务器两边都存在

     3
假使客户端从未脏标记,那就把客户端的标签更新成服务端的典范(注意要拍卖同名争执)

     4
尽管客户端有脏标记。表明它被两端都修改过了,可以尝尝联合大概报告争持让用户决定吗

b 对资源完毕平等的算法

c 对寻找记录(SavedSearches)完结均等的算法

d 对台式机(Notebook)完结均等的算法

e 对链接台式机(LinkedNotesbooks)达成均等算法

f
对笔记(Note)完成平等算法,使用NoteSrore.getNoteContent(…)来收获笔记的一体化数据。

10 按梯次处理需求从客户端删除的数码

a
从联合会聚所有被永久删除(Expunge)的GUID(笔记的),依据汇聚到的GUID,从客户端删除

b 对台式机做同样处理,注意删除台式机时要刨除所有的笔记和资源

c 对寻找记录做一样处理

d 对标签做同样处理

e 对链接笔记多一致处理

11
完结了和服务器的数目统一,把服务器变量updateCount保存到lastUpdateCount,还有啊服务器的此时此刻时间(currenttime)保存到lastSyncTime

12 转去出殡改变

 

4858.com 2

发送改变

13 对每个本土有脏标记的标签进行如下处理

a
若是标记是新的(本地的USN没有被设置过),通过NoteStore.createTag(..)把它添加到服务器。若是服务器报告了一个争执,客户端必须在当地处理这些争辨。会爆发争执的案由是伊夫rnote并不对伙同提供锁,所以自个儿得以再你收获同步块之后,此外有一个客户端对服务器的情节作了有些修改。不过这些几率是在很小。假使服务端报告GUID重复了,那就在地点换一个GUID把(这么些可能率就更小了)

b
如果标签被修改过的(本地的USN被装置过)使用NoteStore.updateTag(….)把服务器的始末更新。要处理同名争持

c 不论是上面哪个种类景况,都要做一下的USN的证实

    i 假若 USN = lastUpdateCount +1
评释客户端一起成功,把lastUpdateCount修改成新的USN

     ii 如若USN > lastUpdateCount +1
那么久说明同步不成功,那就重回在做一个增量同步

14 对有脏标记的查找记录执行同一的算法

15 对有脏标记的笔记本执行同一的算法

16
对有脏标记的笔记执行同一的算法,注意客户端是选择NoteStore.createNote()必须传送有总体数据(包罗ContentPresenter
resource data
等)的笔记(那里注意采用createNote添加到劳动器端添加的Note的GUID和本土的会不雷同,就好添加成果后开展修补),在利用NoteStore.updateNote(..)的时候只须求传送有修改的字段就足以了。

 

3.UI界面(简版)

完全同步的实例

4858.com 3

 

4858.com 4

增量同步实例

4858.com 5

 

图2 标签管理UI界面(简版)

 

 

效益表达:

总结

全然同步和增量同步的多少个区分

1
最要紧的分化就是取得同步块的时候,afterUSN参数设置的例外。增量同步认为毫无处理lastUpdateCount此前的有所数据

2 完全同步时候不会删除本地多余的数目

一切同步模型,我觉着稍显复杂,可是大概在要求把全体账户的数据总体一头的时候,就必须把一心同步和增量同步分开把。对于一大半只是用固定某些台式机,恐怕某些固定标签的使用来说应该不须要那样复杂的一块模型

还有某些沉重的题材尽管,本地删除的数额,无法被同步到服务端。相当于本身在地方删除了一个数据,没办法通过同步啊服务端的数据也删除。那点是自个儿在实际代码中没有选取那几个模型的原因。在下一篇的文章中我会展现一份联合某一个一定台式机中装有笔记的代码。

  • 标签树是标签管理的默许首页,当点击左侧导航条中的“标签管理”,直接突显此标签树页面。
  • 这边为树状结构显示,暗中认可突显超级标签,点击展开显示下顶尖,如此类推!
  • 逐个非末端标签均有新增和修改作用按钮。点击该处新增按钮则在此标签处新增一个下拔尖标签。
  • 背后标签除具备增产和改动功用按钮外,还有删除按钮。此删除原则是唯有“无数据背后标签”才可去除。
  • 标签新增、修改和删除作用,都在标签树子模块完毕

4.新增标签

A.作用描述:新增一个标签到标签树中指定的职位

B.输入消息:标签名称、标签在标签树中所属的逻辑地点(即第几级标签,叶标签是哪个)、标签是或不是启用、备注

C.成效须要:

  • 增产标签须要管理员权限举办,能记录下新增人与新增时间
  • 倘诺新增标签的叶标签在新增前是子标签,那么须求提供一个手动移动数据的效应,即在增产将原属于新增标签叶标签的数量移动到新增标签中;
  • 指出系统在对新标签自动编号时有一套统一的正儿八经,从编号上得以分别不一样的价签级别。

D.UI显示:此页面的上半有的用以体现标签所处的逻辑结构,下半部分对标签举办增产或改动。此页面通过点击图2中的“新增”按钮打开。

4858.com 6图3
新增标签UI

5.改动标签

A.作用描述:对点名标签的相干属性,包蕴:标签名、标签有效性和标签备注等相关属性举行修改

B.输入新闻:标签名称、标签有效性(是还是不是启用)、备注

C.功用须要:修改标签需要管理员权限进行,能记录下修改人与修改时间

D.UI展现

4858.com 7

图4 修改标签UI

6、删除标签

A.成效描述:对叶子标签举行删除

B.输入消息:给某个选定的价签发出删除执行命令

C.功用须求:删除标签由系统管理员执行,删除时出现确认指示。

注意:

  • 一旦该标签在系统运行中已投入使用,只可以修改,不可以去除;
  • 还有父级其他价签下有子标签也不可以不先删除子标签才能去除父标签。

7.询问标签

A.成效描述:对标签举办自定义(模糊)或规范查询

B.效能须求:能查询完整的价签树,可由一般以上权限履行

C.功用点表明:

  • 用户点击查询后,可以查阅标签名、标签录入人、标签录入时间、标签的逻辑结构、备注(标签的表明表明)。
  • 用户点击“查询明细”按钮后,呈现“标签明细”层

D.UI展现

4858.com 8

图5 标签查询UI

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有