ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:106.53KB ,
资源ID:12207885      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12207885.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Android SqlDelight详解和Demo例子.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Android SqlDelight详解和Demo例子.docx

1、Android SqlDelight详解和Demo例子Android SqlDelight详解和Demo例子一、简介SQLDelight 和 SqlBrite 是 Square 公司推出的一个 Android 平台数据库解决方案。在了解这个两个东西前,必须先得有Andorid的Sqlite的知识(SqliteDatabase and SqliteDataHelper), AutoValue要分清他们两个的功能:SqlDelight 是用来把Sql语句生成Java对象的SqlBrite 才是Sqlite操作,结合Rxjava进行响应式数据库操作。SqlBrite教程二、SqlDelightSql

2、Delight是从SQL语句来生成JAVA对象。这样的好处是,所有SQL语句都位于同一个位置,通过查看SQL语句可以清楚的了解需要实现的功能和数据库的结构。SqlDelight添加了对SQL语句的编译时验证、表名字和列名字的代码自动完成功能。让编写SQL语句更加快捷。在编译的时候,根据SQL语句生成Java模型接口和builder来把数据行和Java对象实现转换。2.1 导包在项目build.gradle的dependencies添加:classpath com.squareup.sqldelight:gradle-plugin:0.6.0在module的build.gralde头部添加app

3、lyapply plugin: com.squareup.sqldelight重新Sync即可。2.2 使用SqlDelight 可以根据建表的 SQL 语句自动生成 Java model interface,interface 的每个方法就是这张表的每一列。1. 编写sq语句在main目录创建sqldelight目录,然后按照包名创建目录, main/sqldelight/com/xxx/xxx/sq文件(一定得是正确的目录,不然构建失败)这里编写创建表和查询的语句;create table user( _id INTEGER NOT NULL PRIMARY KEY AUTOINCREME

4、NT, name TEXT NOT NULL, age INTEGER NOT NULL);- 其他的语句通过标识符来引用。在生成的 Java 对象中会包含- 一个该标识符的常亮引用这个语句。- 查询use表,百分号(%)代表零个、一个或多个数字或字符,|连接两个不同的字符串,得到一个新的字符串。select_by_name: select * from user;2. 生成接口Module编写完毕sql语句之后,make一下moduel,即可在build/generated/source/sqldelight/包名/看到xxxModule接口文件 (xxx就是你的sq文件的名称)。可以看到接

5、口大概是这样的。public interface UserModel String TABLE_NAME = user; String _ID = _id; String NAME = name; String AGE = age; String CREATE_TABLE = + create table user(rn + _id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,rn + name TEXT NOT NULL,rn + age INTEGER NOT NULLrn + ); long _id(); NonNull String name(

6、); long age(); interface Creator T create(long _id, NonNull String name, long age); final class Mapper implements RowMapper private final Factory userModelFactory; public Mapper(Factory userModelFactory) this.userModelFactory = userModelFactory; Override public T map(NonNull Cursor cursor) return us

7、erModelFactory.creator.create( cursor.getLong(0), cursor.getString(1), cursor.getLong(2) ); final class Marshal protected final ContentValues contentValues = new ContentValues(); Marshal(Nullable UserModel copy) if (copy != null) this._id(copy._id(); this.name(copy.name(); this.age(copy.age(); publi

8、c ContentValues asContentValues() return contentValues; public Marshal _id(long _id) contentValues.put(_id, _id); return this; public Marshal name(String name) contentValues.put(name, name); return this; public Marshal age(long age) contentValues.put(age, age); return this; final class Factory publi

9、c final Creator creator; public Factory(Creator creator) this.creator = creator; /* * deprecated Use compiled statements ( */ Deprecated public Marshal marshal() return new Marshal(null); /* * deprecated Use compiled statements ( */ Deprecated public Marshal marshal(UserModel copy) return new Marsha

10、l(copy); public SqlDelightStatement select_by_name() return new SqlDelightStatement( + select * from user, new String0, Collections.singleton(user); public Mapper select_by_nameMapper() return new Mapper(this); 从这个接口可以看到重要的有下面四个类和接口:Mapper 把 Cursor 映射为 Java 对象Marshal 把 Java 对象转换为 ContentValues,好方便插入

11、数据库接口Creator 里面定义了一个方法create用来创建我们的Model类型(这里用的是泛型T)Factory 里面包含一个实现了Creator对象的creator,如果有列值需要转换的话还要包括相应的ColumnAdapter,它的构造函数传入Creator和ColumnAdapter这些参数,marshal方法返回Mode的Marshal(通过它的asContentValues获取对应的ContentValues)3. 定义Bean类这里利用AtuoValue重写接口,因为SqlDelight生成的接口适合AutoValue无缝接入的,AutoValue的作用的是,自动生成bean

12、代码,AutoValue请点击我。使用需要导包/基础AutoValueapt com.google.auto.value:auto-value:1.4-rc3provided com.google.auto.value:auto-value:1.4-rc3/AutoValue的扩展,为每个AutoValue注释对象创建一个简单的Gson TypeAdapterFactory。/apt com.ryanharter.auto.value:auto-value-gson:0.4.6provided com.ryanharter.auto.value:auto-value-gson:0.4.6/Au

13、toValue的扩展,支持Android的Parcelableapt com.ryanharter.auto.value:auto-value-parcel:0.2.5/ 可选择TypeAdapter支持compile com.ryanharter.auto.value:auto-value-parcel-adapter:0.2.5这时候User的bean为AutoValuepublic abstract class User implements UserModel public static final Factory FACTORY = new Factory(new Creator()

14、 Override public User create(long _id, NonNull String name, long age) /AutoValue_User 需要先make一下module return new AutoValue_User(_id,name,age); ); public static final RowMapper SELECT_ALL_MAPPER = FACTORY.select_by_nameMapper();4. 使用然后写一个Activity来测试看看(Sqlite相关知识请XX,点我看教程):public class MainActivity ex

15、tends AppCompatActivity Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /创建获取名字为tp的数据库 SQLiteDatabase sqLiteDatabase = new StuDBHelp(this,tp,null,1).getWritableDatabase(); /插入数据 sqLiteDatabase.insert(user,null,cr

16、eateContentValues(0,天平,21); sqLiteDatabase.insert(user,null,createContentValues(1,逼辉,23); Log.e(, 数据数量: +getAllUsers(sqLiteDatabase).size(); public List getAllUsers(SQLiteDatabase db) List result = new ArrayList(); /try-with-resources写法,括号里面的资源需要继承AutoCloseable,作用是可以自动关闭对象 try (Cursor cursor = db.ra

17、wQuery(User.FACTORY.select_by_name().statement, new String0) while (cursor.moveToNext() result.add(User.SELECT_ALL_MAPPER.map(cursor); return result; public ContentValues createContentValues(int id,String name,int age) ContentValues contentValues = new ContentValues(); contentValues.put(_id,id); con

18、tentValues.put(name,name); contentValues.put(age,age); return contentValues; class StuDBHelp extends SQLiteOpenHelper public StuDBHelp(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) super(context, name, factory, version); /第一次创建数据库的调用的方法 Override public void onCreat

19、e(SQLiteDatabase db) /db.execSQL(User.CREATE_TABLE); /创建表 db.execSQL(User.CREATE_TABLE); Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 这时候你会看到输出:数据数量: 22.3 sq语句参数.sq文件使用与SQLite完全相同的语法,包括SQLite绑定args(官方文档点我)。 如果语句包含绑定args,将在Factory上生成类型安全方法,该方法返回包含查询字符串,查询args和要查询的

20、表的字段的SqlDelightStatement。上面的例子中,我把sq文件里面的查询语句添加where条件,变成:select_by_name: select * from user where name=天平;然后重新make一下module,然后修改查询的getAllUsers方法:public List getAllUsers(SQLiteDatabase db) List result = new ArrayList(); /创建 SqlDelightStatement对象,里面有查询字符串和参数 SqlDelightStatement query = User.FACTORY.se

21、lect_by_name(天平); /try_with_resources写法,括号里面的资源需要继承AutoCloseable,作用是可以自动关闭对象 try (Cursor cursor = db.rawQuery(User.FACTORY.select_by_name(天平).statement, query.args) while (cursor.moveToNext() result.add(User.SELECT_ALL_MAPPER.map(cursor); return result; 此时可以看到输出:数据数量: 1如果是数组就用IN:select_by_names:sele

22、ct * from user where name in ?;public List getAllUsers(SQLiteDatabase db) List result = new ArrayList(); SqlDelightStatement query = User.FACTORY.select_by_name(new String天平,逼辉); try (Cursor cursor = db.rawQuery(query.statement, query.args) while (cursor.moveToNext() result.add(User.SELECT_ALL_MAPPE

23、R.map(cursor); return result; 还能用运算符,例如查询user表的name字段是天开头的或结尾的:- 查询use表,百分号(%)代表零个、一个或多个数字或字符,|连接两个不同的字符串,得到一个新的字符串。?1 标识参数为同一个的意思select_by_name: select * from user where name like % | ?1or name like ?1 |%;SqlDelightStatement query = User.FACTORY.select_by_name(天);Cursor cursor = db.rawQuery(query.s

24、tatement, query.args)2.4 插入、更新、删除执行多次的插入,更新和删除 都需要make一下module,SQLDelight会为为它们生成一个类型安全类。例如在User.sq添加一句:- 更新 name为参数1 的年龄为参数2update_age:update user set age = ? where name = ?;重新make一下module会看到UserModel有一个Update_age类: final class Update_age extends SqlDelightCompiledStatement.Update public Update_age(

25、SQLiteDatabase database) super(user, pileStatement( + update user set age = ? where name = ?); public void bind(long age, NonNull String name) program.bindLong(1, age); program.bindString(2, name); 更新的时候(在上面的栗子的MainActivity的onCreate修改): Override protected void onCreate(Bundle savedInstanceState) sup

26、er.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /创建获取名字为tp的数据库 SQLiteDatabase sqLiteDatabase = new StuDBHelp(this,tp,null,1).getWritableDatabase(); /插入数据 sqLiteDatabase.insert(user,null,createContentValues(0,天平,21); sqLiteDatabase.insert(user,null,createContentValues(1,逼辉,23

27、); /创建Update_age对象 User.Update_age updateAge; updateAge = new User.Update_age(sqLiteDatabase); /设置修改的值 updateAge.bind(66,天平); updateAge.bind(99,逼辉); /执行 updateAge.program.execute(); /执行,返回修改的行数,这个方法只修改最后一个 /updateAge.program.executeUpdateDelete(); for(User user:getAllUsers(sqLiteDatabase) Log.e(, us

28、er: +user.toString(); 这时候会看到输出:user: User_id=0, name=天平, age=66user: User_id=1, name=逼辉, age=99ps:注意: 如果是bind了多个,executeUpdateDelete只能修改最后那个。 如果需要同时修改需要使用execute,如上面的代码2.5 多个结果选择返回多个结果列的话,要为查询生成的结果自定义模型、映射程序和工厂方法。例如:在User.sq底部添加语句:- 根据age分组,group_concat链接所有的相同age的名字(默认使用逗号链接)names_for_age:select age, group_concat(name)from usergroup by age;在User bean里面添加一个类和静态常量:AutoValuepublic abstract class User implements UserModel / public static final Factory FACTORY = new Factory(new Creator() Override public User create(long _id, NonNull String name, long age) return new AutoV

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1