咱们在不少项目中都会使用到数据库SQLite,我以前在项目中都是用的第三方框架GreenDao,知道前几天我才据说有个Google本身弄出来的框架Room,后来我研究了几天,简直吊炸天啊!代码量减小了不少,并且使用起来很是的简单。java
首先,什么是Room?为何要选择Room?android
Room是Google官方的数据库框架,在SQLite上提供了一个抽象层,以便在利用SQLite的所有功能的同时能更加流畅的访问数据库。数据库
优势是:安全
1.大大的减小了代码量,,是大大的!!!app
2.层次清晰,上手简单,并且这是谷歌官方提供的,更加安全可靠框架
下面说一下使用的过程:gradle
//room implementation 'android.arch.persistence.room:runtime:1.0.0' annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'
@Entity public class User { @PrimaryKey(autoGenerate = true)//主键是否自动增加,默认为false private int id; private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } public User() { } //这里的getter/setter方法是必须的 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
注意,Room主要是利用了注解,我就常常会忘了记注解,因此常常编译不经过.ui
*实体类开头必需要用@Entity来注解这个类this
*开头定义的变量里面至少有一个主键注解@PrimaryKey,而且为truespa
*必需要有setter跟getter方法
@Dao public interface UserDao { //增 @Insert void insert(User... users); //删 @Delete void delete(User... users); //改 @Update void update(User... users); //查 @Query("SELECT * FROM user") List<User> getAllUsers(); }
Dao主要是定义了增删改查的一系列操做,在开头记得注解@Dao
*@Insert,@Delete,@Update,@Query,分别对应了增删改查四种操做
*@Insert,@Delete,@Update,能够传入多种参数,能够以实体类的方式传入,也能够以List的方式传入
*@Query,也能够返回不一样的类型,能够返回一个实体类,也能够返回一个List,具体看实际应用
// 表名 数据库版本 不添加会警告 @Database(entities = {User.class}, version = 1, exportSchema = false) public abstract class UserDatabase extends RoomDatabase { private static final String DB_NAME = "UserDatabase.db"; private static volatile UserDatabase instance; public static synchronized UserDatabase getInstance(Context context) { if (instance == null) { instance = create(context); } return instance; } private static UserDatabase create(final Context context) { return Room.databaseBuilder( context, UserDatabase.class, DB_NAME) .allowMainThreadQueries() .build(); } public abstract UserDao getUserDao(); }
这里要用@Database来注解这个类而且添加了表名,数据库版本
到这里Room大体就搭建完成了,就能够在项目中运用了,
注意:
在Activity中全部对数据库的操做都不能够在主线程中进行,除非在数据库的Builder上调用了allowMainThreadQueries(),或者全部的操做都在子线程中完成,不然程序会崩溃报如下错误:
java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
接下来就能够在Activity中对数据库进行操做了:
增:
//增 private void insert(String name,int age) { User user = new User(); user.setName(name); user.setAge(age); UserDatabase .getInstance(this) .getUserDao() .insert(user); }
删:
//删所有 private void delAll() { UserDatabase .getInstance(this) .getUserDao() .deleteAll(); tv.setText(null); }
改:
//改 private void update(String name,int age) { User user = 须要修改的那一项数据的实体类; user.setName(name); user.setAge(age); UserDatabase .getInstance(this) .getUserDao() .update(user); }
查:
//查 private void query() { List<User> allUsers = UserDatabase .getInstance(this) .getUserDao() .getAllUsers(); for (int i = 0; i < allUsers.size(); i++) { tv.append(allUsers.get(i).getId() + "\n"); tv.append(allUsers.get(i).getName() + "\n"); tv.append(allUsers.get(i).getAge() + "\n"); } }
以上就是Room基本的搭建跟增删改查的操做了,未完待续...
若有不足之处,还请指出