栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android Room数据实验案例

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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> 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> 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 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对象

    
}

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> queryAll(){
        return dao.queryAll();
    }

    public LiveData> queryWithWordsLive(String str){
        return dao.queryWithWordsLive(str);
    }

    public List 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{
        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为传入的实例类型
        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{
        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{//用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> queryAll(){
        return repository.queryAll();
    }

    public LiveData> queryWithWordsLive(String str){
        return repository.queryWithWordsLive(str);
    }

    public List 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> dataLive;
    private RecyclerViewAdapterOne adapter;
    private StudentViewModel viewModel;
    private List 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>() {
            @Override
            public void onChanged(List 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数据库就可以实现其高效和维护性高的特性了。

学到了,哈哈!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/631050.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号