Android Room数据实验案例

Posted €€-飞翔 -~£

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Room数据实验案例相关的知识,希望对你有一定的参考价值。

1、在build.gradle里引入room库依赖:

dependencies 
    implementation 'androidx.room:room-runtime:2.2.5'
    annotationProcessor 'androidx.room:room-compiler:2.2.5'

2、创建数据表类:

package com.example.experimentforsqlite.sqliteRoom.tables;

import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;

@Entity//通过Entity接口来声明本类为表格类
public class Students 
    @PrimaryKey(autoGenerate = true)//通过接口设置自增约束
    @ColumnInfo(name="id")//设置属性字段名
    private int id;

    @ColumnInfo(name="student_name")
    private String studentName;

    @ColumnInfo(name="student_sex")
    private String studentSex;

    @ColumnInfo(name = "student_phone")
    private String Phone;

    public int getId() 
        return id;
    

    public void setId(int id) 
        this.id = id;
    

    public String getStudentName() 
        return studentName;
    

    public void setStudentName(String studentName) 
        this.studentName = studentName;
    

    ......

3、创建dao接口:

package com.example.experimentforsqlite.sqliteRoom.daos;

import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
import com.example.experimentforsqlite.sqliteRoom.tables.Students;
import java.util.List;

@Dao//声明此为dao接口
public interface StudentDao 
    @Insert//声明此为插入方法
    void insertStudents(Students... students);
    @Delete//声明此外删除方法
    void deleteStudents(Students... students);
    @Update//声明此外修改方法
    void updateStudents(Students... students);
    @Query("Delete FROM Students")//通过query类调用原生sql代码操作数据库
    void clear();
    @Query("SELECT * FROM Students")
    LiveData<List<Students>> queryAll();
    @Query("SELECT * FROM students WHERE student_name LIKE :str OR student_phone LIKE :str OR student_phone LIKE :str ORDER BY id DESC")
    LiveData<List<Students>> queryWithWordsLive(String str);
    @Query("SELECT * FROM students WHERE student_name LIKE :str OR student_phone LIKE :str OR student_phone LIKE :str ORDER BY id DESC")
    List<Students> queryWithWords(String str);

4、创建数据库类继承room数据库的基类:

package com.example.experimentforsqlite.sqliteRoom.database;

import android.content.Context;
import androidx.room.Database;
import androidx.room.Room;
import com.example.experimentforsqlite.sqliteRoom.daos.StudentDao;
import com.example.experimentforsqlite.sqliteRoom.tables.Students;

@Database(entities = Students.class,version = 1,exportSchema = false)
//声明此外数据库类,entities对应要操作的表们
public abstract class UseRoomDatabase extends androidx.room.RoomDatabase 
    private static UseRoomDatabase INSTANCE;//声明单例对象,减小数据库开销
    private static final String DATABASE_NAME="room_database_test";

    public static UseRoomDatabase getINSTANCE(Context context) //通过单例对象获取数据库
        if(INSTANCE==null)
            INSTANCE= Room.databaseBuilder(context,UseRoomDatabase.class,DATABASE_NAME)
                    //.addMigrations(MIGRATION_1_2)更新数据库
                    .build();
        
        return INSTANCE;
    

    public abstract StudentDao getStudentDao();//创建抽象的dao方法以便获取dao对象

    /*static Migration MIGRATION_1_2=new Migration(1,2) //数据库迁移
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) 
            database.execSQL("ALTER TABLE WORDS ADD COLUMN COL_NAME INTEGER NOT NULL DEFAULT 1");
        
    ;*/

5、由于使用规范,所以我们需创建一个repository仓库类来对数据库数据进行操作,其中,由于需要使用异步实现,所以我们创建内部类来继承AsyncTask类以实现异步效果。

package com.example.experimentforsqlite.sqliteRoom.repositories;


import android.content.Context;
import android.os.AsyncTask;
import androidx.lifecycle.LiveData;
import com.example.experimentforsqlite.sqliteRoom.daos.StudentDao;
import com.example.experimentforsqlite.sqliteRoom.database.UseRoomDatabase;
import com.example.experimentforsqlite.sqliteRoom.tables.Students;
import java.util.List;

public class StudentRepository 
    private UseRoomDatabase database;
    private StudentDao dao;

    public StudentRepository(Context context) 
        database=UseRoomDatabase.getINSTANCE(context);
        dao=database.getStudentDao();
    

    public LiveData<List<Students>> queryAll()
        return dao.queryAll();
    

    public LiveData<List<Students>> queryWithWordsLive(String str)
        return dao.queryWithWordsLive(str);
    

    public List<Students> queryWithWords(String str)
        return dao.queryWithWords(str);
    

    public void insert(Students... students)
        new InsertAsyncTask(dao).execute(students);//通过该语句来调用异步方法
    

    public void update(Students... students)
        new UpdateAsyncTask(dao).execute(students);//通过该语句来调用异步方法
    

    public void delete(Students... students)
        new DeleteAsyncTask(dao).execute(students);//通过该语句来调用异步方法
    

    public void clear()
        new ClearAsyncTask(dao).execute();
    

    static class InsertAsyncTask extends AsyncTask<Students,Void,Void>
        public StudentDao dao;

        public InsertAsyncTask(StudentDao dao) 
            this.dao = dao;
        

        @Override
        protected Void doInBackground(Students... students) 
            dao.insertStudents(students);
            return null;
        
    

    static class UpdateAsyncTask extends AsyncTask<Students,Void,Void>//Students为传入的实例类型
        public StudentDao dao;

        public UpdateAsyncTask(StudentDao dao) 
            this.dao = dao;
        

        @Override
        protected Void doInBackground(Students... students) //异步后台执行
            dao.updateStudents(students);
            return null;
        
    

    static class DeleteAsyncTask extends AsyncTask<Students,Void,Void>
        public StudentDao dao;

        public DeleteAsyncTask(StudentDao dao) 
            this.dao = dao;
        

        @Override
        protected Void doInBackground(Students... students) 
            dao.deleteStudents(students);
            return null;
        
    

    static class ClearAsyncTask extends AsyncTask<Void,Void,Void>//用Viod来放入无参的方法
        public StudentDao dao;

        public ClearAsyncTask(StudentDao dao) 
            this.dao = dao;
        

        @Override
        protected Void doInBackground(Void... voids) 
            dao.clear();
            return null;
        
    

6、通过ViewModel来获取数据:

package com.example.experimentforsqlite.sqliteRoom.viewModels;

import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import com.example.experimentforsqlite.sqliteRoom.repositories.StudentRepository;
import com.example.experimentforsqlite.sqliteRoom.tables.Students;
import java.util.List;

public class StudentViewModel extends AndroidViewModel 
    private StudentRepository repository;

    public StudentViewModel(@NonNull Application application) 
        super(application);
        repository=new StudentRepository(application);
    

    public LiveData<List<Students>> queryAll()
        return repository.queryAll();
    

    public LiveData<List<Students>> queryWithWordsLive(String str)
        return repository.queryWithWordsLive(str);
    

    public List<Students> queryWithWords(String str)
        return repository.queryWithWords(str);
    

    public void clear()
        repository.clear();//调用respository里的方法
    

    public void delete(Students... students)
        repository.delete(students);
    

    public void insert(Students... students)
        repository.insert(students);
    

    public void update(Students... students)
        repository.update(students);
    

7、活动里直接声明viewModel使用就好:

package com.example.experimentforsqlite.sqliteRoom;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import com.example.experimentforsqlite.adapters.RecyclerViewAdapterOne;
import com.example.experimentforsqlite.databinding.ActivitySqliteRoomMainBinding;
import com.example.experimentforsqlite.sqliteRoom.tables.Students;
import com.example.experimentforsqlite.sqliteRoom.viewModels.StudentViewModel;
import java.util.List;

public class SqliteRoomMain extends AppCompatActivity 
    private ActivitySqliteRoomMainBinding binding;
    private LiveData<List<Students>> dataLive;
    private RecyclerViewAdapterOne adapter;
    private StudentViewModel viewModel;
    private List<Students> data;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        viewModel= new ViewModelProvider(this,new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(StudentViewModel.class);
        binding=ActivitySqliteRoomMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        initView();
    

    private void initView()
        dataLive=viewModel.queryAll();
        binding.recyclerView1.setLayoutManager(new LinearLayoutManager(this));
        dataLive.observe(this, new Observer<List<Students>>() 
            @Override
            public void onChanged(List<Students> students) 
                data=students;
                adapter=new RecyclerViewAdapterOne(data);
                binding.recyclerView1.setAdapter(adapter);
            
        );
        binding.buttonInsert.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                startActivity(new Intent(SqliteRoomMain.this,InsertMainForRoom.class));
            
        );
    


    //直接使用viewModel对象的方法即可。

    private void update(Students... students)
        viewModel.update(students);
    

    private void clear()
        viewModel.clear();
    

    private void delete(Students... students)
        viewModel.delete(students);
    

room数据库使用总结:

        分别建数据表、数据表对应的Dao操作接口、数据库继承room基类数据库,由于通过异步来实现请求,所以我们需要设置仓库类来单独处理,在其内部添加异步实现类来完成异步操作,最后通过ViewModel来临时保存数据,活动类通过使用viewModel对象可实现对应的增删改查。

        这样room数据库就可以实现其高效和维护性高的特性了。

学到了,哈哈!

以上是关于Android Room数据实验案例的主要内容,如果未能解决你的问题,请参考以下文章

Android Room LiveData观察器未更新

Android Room Persistence 库和 Kotlin

如何使用 android room 解决孤岛/间隙问题?

android----Room数据库的简单操作

在 Room 数据库实体上实现 Parcelable 是一种好习惯吗?

为什么Android导航组件无法返回上一个片段?