Android_數據庫_Room_GreenDao的基本使用


1、導包:

implementation "androidx.room:room-runtime:2.2.3"
annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'

2、添加數據庫

@Database(entities = {User.class}, version = 1, exportSchema = false)
public abstract class MyDataBase extends RoomDatabase {

    public abstract UserDao getUserDao();

}

3、Application里面初始化

public class AppContext extends Application {

    public static MyDataBase myDataBase;

    @Override
    public void onCreate() {
        super.onCreate();
        initDataBase();
    }

    /* 初始化 數據庫 */
    private void initDataBase() {
        Log.v("fwling", "初始化數據庫");
        myDataBase = Room.databaseBuilder(getApplicationContext(), MyDataBase.class, "User.db")
                .build();
    }
}

4、建立實體類(get和set方法一定要加上)

@Entity(tableName = "Users")
public class User {

    @NonNull
    @PrimaryKey
    @ColumnInfo(name = "UserId")
    private String uuid;

    @ColumnInfo(name = "UserName")
    private String userName;

    @ColumnInfo(name = "Date")
    private String date;

    @Ignore
    public User(String userName) {
        this.uuid = UUID.randomUUID().toString();
        this.userName = userName;
        this.date = SimpleDateFormat.getDateInstance().format(new Date(System.currentTimeMillis()));
    }

    public User(String uuid, String userName, String date) {
        this.uuid = uuid;
        this.userName = userName;
        this.date = date;
    }

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }
}

5、添加UserDao

@Dao
public interface UserDao {

    @Query("SELECT * FROM Users")
    List<User> getUsers();

    @Insert
    void addUser(User user);

    @Insert
    void addAll(List<User> userList);

    @Delete
    int deleteUser(User user);

    @Update
    int updateUser(User user);


}

6、使用

獲取數據
List<Fruit> users = AppContext.myDataBase.getFruitDao().getFruits();

插入數據
User user = new User(et.getText().toString());
AppContext.myDataBase.getUserDao().addUser(user);

需要注意的是:數數據庫所有的操作都需要在子線程種運行。這里可以配合RxJava來使用

數據庫的操作就到這里,結束了。

 

下面來看一下數據庫的升級管理

此次升級,增加了一張Fruit表

1、添加

@Database(entities = {User.class, Fruit.class}, version = 2, exportSchema = false)
public abstract class MyDataBase extends RoomDatabase {

    /* 升級數據庫的方法 -- 當前為從 版本1 升級到 版本2 */
    public static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(SupportSQLiteDatabase database) {
            // 這里新創建一個Fruit表
            database.execSQL("CREATE TABLE `Fruit` (`FruitId` INTEGER NOT NULL, "
                    + "`FruitName` TEXT, PRIMARY KEY(`FruitId`))");

        }
    };

    public abstract UserDao getUserDao();

    public abstract FruitDao getFruitDao();
}


需要變化的點:
1、表,entities 的注解里面多了一個Fruit表
2、版本號+1 =2
3、添加了一個Migration 、MIGRATION_1_2表示從1升到2的時候需要做的所有操作
4、添加了一個新表對應的FruitDao

2、添加實體類和相應的Dao

實體類:
@Entity(tableName = "Fruit")
public class Fruit {

    @NonNull
    @PrimaryKey
    @ColumnInfo(name = "FruitId")
    private Integer FruitId;

    @ColumnInfo(name = "FruitName")
    private String FruitName;

    public Fruit() {
        this.FruitName = "default_Fruit_Name";
    }

    @Ignore
    public Fruit(String FruitName) {
        this.FruitName = FruitName;
    }

    @NonNull
    public Integer getFruitId() {
        return FruitId;
    }

    public void setFruitId(@NonNull Integer fruitId) {
        FruitId = fruitId;
    }

    public String getFruitName() {
        return FruitName;
    }

    public void setFruitName(String fruitName) {
        FruitName = fruitName;
    }
}

DAO:
@Dao
public interface FruitDao {

    @Query("SELECT * FROM Fruit")
    List<Fruit> getFruits();

    @Insert
    void addFruit(Fruit fruit);
}

3、添加升級操作

public class AppContext extends Application {

    public static MyDataBase myDataBase;

    @Override
    public void onCreate() {
        super.onCreate();
        initDataBase();
    }

    /* 初始化 數據庫 */
    private void initDataBase() {
        Log.v("fwling", "初始化數據庫");
        myDataBase = Room.databaseBuilder(getApplicationContext(), MyDataBase.class, "User.db")
                .addMigrations(MyDataBase.MIGRATION_1_2)
                .build();
    }
}

多了一行:.addMigrations(MyDataBase.MIGRATION_1_2)

  

以上就是Room的基本使用

下面來看看,GreenDao的基本使用

1、添加依賴(看清楚相應的文字說明,應該添加到哪里。別搞錯)

在根項目的build.gradle的buildscript的dependencies下添加greenDao的插件
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'


項目的module下build.gradle的dependencies添加Green相應的包
//greenDAO配置
compile 'org.greenrobot:greendao:3.2.2'

同時在module(App)下build.gradle添加插件的使用
apply plugin: 'org.greenrobot.greendao'

 2、設置版本號、生成目錄等

在module(App)的build.gradle 下添加GreenDao的配置信息

//greendao配置
greendao {
    //數據庫版本號,升級時修改
    schemaVersion 1
    //生成的DAO,DaoMaster和DaoSession的包路徑。默認與表實體所在的包路徑相同
    daoPackage 'com.fwl.demo.green_dao.db'
}

3、初始化數據庫

public class AppContext extends Application {

    private static DaoSession daoSession;

    @Override
    public void onCreate() {
        super.onCreate();
        initGreenDao();
    }

    /* 初始化 數據庫 */
    private void initGreenDao() {
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "aserbao.db");
        SQLiteDatabase db = helper.getWritableDatabase();
        DaoMaster daoMaster = new DaoMaster(db);
        daoSession = daoMaster.newSession();
    }

    
    public static DaoSession getDaoSession() {
        return daoSession;
    }
}

4、創建實體類

@Entity
public class Student {
    @Id(autoincrement = true)
    Long id;

    String name;//姓名

    @Generated(hash = 1097502469)
    public Student(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    @Generated(hash = 1556870573)
    public Student() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


說明:我這邊只添加了兩個屬性
@Id(autoincrement = true)
Long id;
String name;//姓名

get和set是手動、手動、手動生成的
構造方法是自動、自動、自動生成的

5、編譯,這步很重要。步驟三的有些報錯的地方都是這步編譯后導入的包。

具體操作:Build--->Make Project

6、使用:

//查詢
List<Student> students = AppContext.getDaoSession().getStudentDao().getSession().loadAll(Student.class);


//添加
Student student=new Student();
student.setName("dsa");
AppContext.getDaoSession().getStudentDao().insert(student);


//刪除
AppContext.getDaoSession().getStudentDao().deleteAll();


//更新<查找id為1的Student,並將它的Name改為ABC>
Student students = AppContext.getDaoSession().getStudentDao().getSession().load(Student.class, StudentDao.Properties.Id.eq(1));
student.setName("ABC");
AppContext.getDaoSession().getStudentDao().update(student);

GreenDao的基本使用就是上面這些了。

下面來看看,Room和GreenDao的區別

GreenDao Room
開發者只需要規定Entity的屬性即可 需要規定Entity的屬性,需要規定Dao接口
每次更新Entity需要重新build以生成代碼,大型項目build耗時會比較久 更新Entity不需要重新build,因為使用的是Dao接口規定的方法,但是需要根據情況更新Dao接口
只有進行復雜操作時才需要寫SQL語句 即使是進行簡單的條件查詢,也要寫SQL語句
有一定的學習成本,需要學習注解、查詢、條件語句等API 學習成本低,基本只需要掌握Room的注解即可

最后,兩者的速度對比,GreenDao在批量操作數據的情況下,會比Room慢,慢不少。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM