Android使用Room持久化SQLite
前言
Android中提供了SQLite数据库进行数据的持久化 ,并提供了对应API访问数据库,而Room框架提供了SQLite数据访问抽象层,为高效的数据库访问层带来便捷
APP可以缓存用户数据,当APP离线时便从SQLite读取数据,当重新连线时即可完成和服务器数据的同步
谷歌官方强烈推荐使用Room框架操作SQLite数据库
Hello World
首先在build.gradle
中添加必要依赖
dependencies { def room_version = "1.1.1" implementation "android.arch.persistence.room:runtime:$room_version" annotationProcessor "android.arch.persistence.room:compiler:$room_version" // use kapt for Kotlin // optional - RxJava support for Room implementation "android.arch.persistence.room:rxjava2:$room_version" // optional - Guava support for Room, including Optional and ListenableFuture implementation "android.arch.persistence.room:guava:$room_version" // Test helpers testImplementation "android.arch.persistence.room:testing:$room_version" }
创建实体类User
,@Entity
表示该类对应数据库中的表,@ColumnInfo
后面的name
属性对应数据库中的字段名,并实现该实体类的Getter
,Setter
方法
@Entity public class User { @PrimaryKey private int uid; @ColumnInfo(name = "first_name") private String firstName; @ColumnInfo(name = "last_name") private String lastName; public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } @Override public String toString() { return "User{" + "uid=" + uid + ", firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + '}'; } }
创建实体类对应的dao
层UserDao
,完成User的增删改查(CRUD
)接口定义,@Dao
注解定义一个dao层,参数赋值(传递)使用:clumn_name
进行赋值
@Dao public interface UserDao { @Query("SELECT * FROM user") List<User> getAll(); @Query("SELECT * FROM user WHERE uid IN (:userIds)") List<User> loadAllByIds(int[] userIds); @Query("SELECT * FROM user WHERE first_name LIKE :first AND " + "last_name LIKE :last LIMIT 1") User findByName(String first, String last); @Insert(onConflict = OnConflictStrategy.REPLACE) void insertAll(User... users); @Delete void delete(User user); }
创建AppDatabase
,@Database
注解表示这是一个数据库操作类,entities
对应Entity
实体类,version
用于数据库版本升级,并在该抽象类中定义一个返回dao
层的抽象方法
@Database(entities = {User.class}, version = 1, exportSchema = false) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
初始化用于操作数据库的实例对象AppDatabase
,需要注意的是不能在主线程中初始化,必须新开启一个线程进行初始化,否则会报错,或者无法创建数据库
new Thread(new Runnable() { @Override public void run() { AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").build(); } }).start();
测试
增加,也可以传一个User
数组
for (int i = 0; i < 10; i++) { User user = new User(); user.setUid(i); user.setFirstName("Shell" + i); user.setLastName("Hub" + i); insertAll(db, user); }
如果报以下错误,修改dao层的注解为@Insert(onConflict = OnConflictStrategy.REPLACE)
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: User.uid (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY)
查询所有数据
for (User user : db.userDao().getAll()) { System.out.println(user); }
other...
Room单例模式
最好使用设计模式中的单例模式获取数据库实例,因为每次获取数据库实例都很耗时并且耗内存,我们可以自定义一个类继承Application
并定义一个public static
方法获取数据库实例
public class App extends Application { private static Context context; private static final String DATABASE_NAME = "SHELLHUB"; private static AppDatabase DB_INSTANCE; @Override public void onCreate() { super.onCreate(); context = getApplicationContext(); new Thread(new Runnable() { @Override public void run() { DB_INSTANCE = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, DATABASE_NAME).build(); } }).start(); } public static AppDatabase getDB() { return DB_INSTANCE; } }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android 接入高德地图SDK模块的优化点点滴滴
起因: 由于在最近接手了一个关于导航的App,发现地图页面跳来跳去实在是卡顿地不行(运行在车载设备上的APP,机器性能实在是有限)。 初步判断: 应该是是关于地图等控件的反复创建和销毁,给内存GC带来了很大的压力。 简单调查: 通过 命令 adb shell dumpsys meminfo com.xxxx.xxx (后面那个是包名,当然你可以使用MAT等工具来看) 带有地图控件的页面之间跳来跳去,大量对象没有及时被回收,导致内存占用过高 解决方案: 利用Fragment来抽离各个有MapView的Activity中的业务逻辑,留下一个MapActivity就专门负责地图业务逻辑的效果展示; 这样多个带地图控件的Activity页面,就可以复用首页的地图控件即可,这样就可以复用地图控件这样的大对象了 上图,仅仅做了一个涉及到地图业务的优化(搜索页面),就少了10多M,效果还不错,目前在首页和搜索页面来回切换也都流畅许多了 探索高德地图: 有了上面的解决方案后,我就猜想高德地图可能也是这么干的,因为从首页到线路规划,再到导航,都是用了地图控件,那也是肯定是地图复用,才能减少大对象的创建和...
- 下一篇
Android 项目集成腾讯X5浏览器内核
1、为什么要集成腾讯 X5 浏览器内核 肯定是事出有因,简单来说,JS代码写的不标准,与部分机型内嵌套的浏览器内核产生矛盾,出现底层(os)bug导致,不得不费事搞一个其它内核进行加载网页,具体原因。 2、官方网站及导入 jar 包等 (1)、TBS腾讯浏览服务、jar 下载地址、官方接入文档 目前为止(2018/8/3),就三种。如图: TBS sdk 我们就下载对简单第一种吧,足以满足我们的需要了。 (2)、项目内导入jar文件 解压之后,文件很多,但是有用的我感觉就是jar文件了。 解压之后 (3)、如何在自己项目内集成jar文件(基础) 第一步:将“.jar”文件考入到项目下面的libs文件夹,如图: 项目内拷入 jar 文件 第二步:在 jar 文件上右击,调出下拉菜单 ,点击下图标注的 Add As Library... 选项 第二步 第三步:选择jar 文件添加到的项目,我这里直接确定就行了: 第三步 第四步;等待Android Studio 进行同步下载,配置等等。 第五步:检查是否导入成功 第五步 3、项目实战 (1)、布局代码 布局内创建一个腾讯的 WebView ...
相关文章
文章评论
共有0条评论来说两句吧...