安卓持久框架Room VS GreenDao

一 、Room的基本使用

1、導包:

1

2

implementation "androidx.room:room-runtime:2.2.3"

annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'

2、添加數據庫

1

2

3

4

5

6

@Database(entities = {User.class}, version = 1, exportSchema = false)

public abstract class MyDataBase extends RoomDatabase {

 

    public abstract UserDao getUserDao();

 

}

3、Application裏面初始化

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public class AppContext extends Application {

 

    public static MyDataBase myDataBase;

 

    @Override

    public void onCreate() {

        super.onCreate();

        initDataBase();

    }

 

    /* 初始化 數據庫 */

    private void initDataBase() {

        myDataBase = Room.databaseBuilder(getApplicationContext(), MyDataBase.class"User.db")

                .build();

    }

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

@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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

@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、使用

1

2

3

4

5

6

7

8

獲取數據

List<Fruit> users = AppContext.myDataBase.getFruitDao().getFruits();

 

插入數據

User user = new User(et.getText().toString());

AppContext.myDataBase.getUserDao().addUser(user);

 

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

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

 

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

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

1、添加

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

@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(12) {

        @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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

實體類:

@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、添加升級操作

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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、添加依賴(看清楚相應的文字說明,應該添加到哪裏。別搞錯)

1

2

3

4

5

6

7

8

9

10

在根項目的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、設置版本號、生成目錄等

1

2

3

4

5

6

7

8

9

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

 

//greendao配置

greendao {

    //數據庫版本號,升級時修改

    schemaVersion 1

    //生成的DAO,DaoMaster和DaoSession的包路徑。默認與表實體所在的包路徑相同

    daoPackage 'com.fwl.demo.green_dao.db'

}

3、初始化數據庫

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

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、創建實體類

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

@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、使用:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

//查詢

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慢,慢不少。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章