Android Room은 사용하기 쉽습니다.

1. 설명

Room은 SQLite 기반 추상화 계층을 제공하는 Android Jetpack의 일부입니다. 이 문서에서는 LiveData 및 ViewModel을 결합한 Room을 사용하여 데모를 구현합니다.

두 가지, 예

1. 종속성 추가

build.gradle(모듈: 앱) 종속성 추가

// Room components
dependencies {
    
    
    // Room components
    implementation "androidx.room:room-runtime:$rootProject.roomVersion"
    annotationProcessor "androidx.room:room-compiler:$rootProject.roomVersion"
    androidTestImplementation "androidx.room:room-testing:$rootProject.roomVersion"

    // Lifecycle components
    implementation "androidx.lifecycle:lifecycle-extensions:$rootProject.archLifecycleVersion"
    annotationProcessor "androidx.lifecycle:lifecycle-compiler:$rootProject.archLifecycleVersion"

    // UI
    implementation "com.google.android.material:material:$rootProject.materialVersion"
}

build.gradle(프로젝트: room_java) 버전 번호를 입력하세요. 버전 번호는 여기 에서 확인할 수 있습니다.

ext {
    
    
    roomVersion = '2.2.5'
    archLifecycleVersion = '2.2.0'
    materialVersion = '1.0.0'
}
2. 엔터티 클래스
@Entity(tableName = "feizai_table")
public class Feizai {
    
    

    @PrimaryKey
    @NonNull
    @ColumnInfo(name = "first_name")
    private String firstName;

    @ColumnInfo(name = "second_name")
    private String secondName;

    @NonNull
    public String getFirstName() {
    
    
        return firstName;
    }

    public void setFirstName(@NonNull String firstName) {
    
    
        this.firstName = firstName;
    }

    public String getSecondName() {
    
    
        return secondName;
    }

    public void setSecondName(String secondName) {
    
    
        this.secondName = secondName;
    }
}
3. 다오 인터페이스

데이터베이스 DAO는 인터페이스입니다 . 삭제 및 수정 시에는 Feizai 클래스가 전달되는데, Feizai 클래스에 해당 데이터베이스의 Primary Key에 따라 수정 및 삭제가 되는데, 즉 Feizai 클래스의 다른 필드가 무엇인지는 상관이 없으나, 기본 키의 해당 필드 값에 따라 데이터베이스에서 작동합니다. LiveData를 사용하는 목적은 데이터베이스를 모니터링하고 실시간으로 인터페이스를 새로 고치는 것입니다.

@Dao
public interface FeizaiDao {
    
    

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    void insert(Feizai feizai);

    @Query("SELECT * FROM feizai_table")
    LiveData<List<Feizai>> getAllFeizai();

    @Delete(entity = Feizai.class)
    void delete(Feizai feizai);

    @Update(entity = Feizai.class)
    void update(Feizai feizai);
}
4. 데이터베이스 클래스

데이터베이스 수정 시에는 데이터베이스 버전, 즉 버전+1로 업그레이드하고 addMigrations에서 데이터베이스 작업을 추가해야 합니다. 데이터베이스 테이블의 필드를 줄이려면 임시 테이블을 만든 다음 데이터를 임시 테이블로 마이그레이션하고 이전 데이터베이스 테이블을 삭제한 다음 이전 데이터베이스와 동일한 이름으로 데이터베이스 테이블을 만든 다음 임시 테이블의 데이터를 새 데이터베이스로 마이그레이션 테이블에서 임시 데이터베이스 테이블을 삭제하여 데이터베이스의 필드를 삭제하고 이전 데이터를 저장합니다.

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

    public abstract FeizaiDao getFeizaiDao();

    private static volatile FeizaiDatabase INSTANCE;
    private static final int NUMBER_OF_THREADS = 4;
    public static final ExecutorService databaseWriteExecutor =
            Executors.newFixedThreadPool(NUMBER_OF_THREADS);

    public static FeizaiDatabase getDatabase(Context context) {
    
    
        if (INSTANCE == null) {
    
    
            synchronized (FeizaiDatabase.class) {
    
    
                if (INSTANCE == null) {
    
    
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                            FeizaiDatabase.class, "Feizai.db")
                            .addMigrations(MIGRATION_1_2)
                            .build();
                }
            }
        }
        return INSTANCE;
    }

    static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    
    
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
    
    
            database.execSQL("ALTER TABLE feizai_table ADD COLUMN sex STRING");
        }
    };
}
5. 리포지토리 클래스
public class FeizaiRepository {
    
    

    private FeizaiDao mFeizaiDao;
    private LiveData<List<Feizai>> mFeizais;

    public FeizaiRepository(Application application) {
    
    
        FeizaiDatabase db = FeizaiDatabase.getDatabase(application);
        mFeizaiDao = db.getFeizaiDao();
        mFeizais = mFeizaiDao.getAllFeizai();
    }

    public LiveData<List<Feizai>> getAllFeizais() {
    
    
        return mFeizais;
    }

    public void insert(Feizai feizai) {
    
    
        FeizaiDatabase.databaseWriteExecutor.execute(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                mFeizaiDao.insert(feizai);
                mFeizais = mFeizaiDao.getAllFeizai();
            }
        });
    }

    public void delete(Feizai feizai) {
    
    
        WordRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                mFeizaiDao.delete(feizai);
            }
        });
    }

    public void update(Feizai feizai) {
    
    
        WordRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                mFeizaiDao.update(feizai);
            }
        });
    }
}
6. ViewModel 클래스
public class FeizaiViewModel extends AndroidViewModel {
    
    

    private FeizaiRepository mReposity;
    private LiveData<List<Feizai>> mAllFeizais;

    public FeizaiViewModel (Application application) {
    
    
        super(application);
        mReposity = new FeizaiRepository(application);
        mAllFeizais = mReposity.getAllFeizais();
    }

    public LiveData<List<Feizai>> getmAllFeizais() {
    
    
        return mAllFeizais;
    }

    public void insert(Feizai feizai) {
    
    
        mReposity.insert(feizai);
    }

    public void delete(Feizai feizai) {
    
    
        mReposity.delete(feizai);
    }

    public void update(Feizai feizai) {
    
    
        mReposity.update(feizai);
    }
}
7. feizai_item.xml 문건
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_margin="4dp"
    style="@style/word_title">

    <TextView
        android:id="@+id/item_first"
        android:layout_marginVertical="10dp"
        android:layout_width ="match_parent"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/item_second"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>
8. Activity_feizai.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FeizaiActivity">

    <EditText
        android:id="@+id/first_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:hint="First Name"/>
    <EditText
        android:id="@+id/second_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/first_name"
        android:hint="Second Name"/>
    <Button
        android:id="@+id/btn_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/second_name"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@id/delete"
        android:text="@string/insert"/>
    <Button
        android:id="@+id/delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/second_name"
        app:layout_constraintLeft_toRightOf="@id/btn_add"
        app:layout_constraintRight_toRightOf="parent"
        android:text="@string/delete"/>
    <Button
        android:id="@+id/btn_update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/btn_add"
        app:layout_constraintLeft_toLeftOf="@id/btn_add"
        android:text="@string/update"/>
    <Button
        android:id="@+id/insert"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/delete"
        app:layout_constraintLeft_toLeftOf="@id/delete"
        android:text="占坑"/>
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rc_feizai"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_margin="6dp"
        app:layout_constraintTop_toBottomOf="@id/btn_update"
        app:layout_constraintBottom_toBottomOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>
9. FeizaiListAdapter类
public class FeizaiListAdapter extends RecyclerView.Adapter<FeizaiListAdapter.FeizaiViewHolder> {
    
    

    private final LayoutInflater mInflater;
    private List<Feizai> mFeizais;

    public FeizaiListAdapter(Context context) {
    
    
        mInflater = LayoutInflater.from(context);
    }

    @NonNull
    @Override
    public FeizaiViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
    
        View itemView = mInflater.inflate(R.layout.feizai_item, parent, false);
        return new FeizaiViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull FeizaiViewHolder holder, int position) {
    
    
        if (mFeizais != null) {
    
    
            Feizai current = mFeizais.get(position);
            holder.itemFirst.setText(current.getFirstName());
            holder.itemSecond.setText(current.getSecondName());
        } else {
    
    
            holder.itemFirst.setText("没有查到肥仔");
            holder.itemSecond.setText("没有查到肥仔");
        }
    }

    @Override
    public int getItemCount() {
    
    
        if (mFeizais == null)
            return 0;
        return mFeizais.size();
    }

    public void setFeizai(List<Feizai> feizais) {
    
    
        mFeizais = feizais;
        notifyDataSetChanged();
    }

    class FeizaiViewHolder extends RecyclerView.ViewHolder {
    
    

        private final TextView itemFirst;
        private final TextView itemSecond;

        private FeizaiViewHolder(View itemView) {
    
    
            super(itemView);
            itemFirst = itemView.findViewById(R.id.item_first);
            itemSecond = itemView.findViewById(R.id.item_second);
        }
    }
}
10. FeizaiActivity 类
public class FeizaiActivity extends AppCompatActivity {
    
    

    private FeizaiViewModel mFeizaiViewModel;
    private FeizaiListAdapter adapter;
    RecyclerView rv;
    EditText firstName, secondName;
    Button add, delete, insert, update;
    Feizai feizai;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_feizai);

        initView();
        feizai = new Feizai();
        mFeizaiViewModel = new ViewModelProvider(this).get(FeizaiViewModel.class);
        mFeizaiViewModel.getmAllFeizais().observe(this, feizais -> adapter.setFeizai(feizais));
    }

    private void initView() {
    
    
        add = findViewById(R.id.btn_add);
        insert = findViewById(R.id.insert);
        delete = findViewById(R.id.delete);
        update = findViewById(R.id.btn_update);
        rv = findViewById(R.id.rc_feizai);
        firstName = findViewById(R.id.first_name);
        secondName = findViewById(R.id.second_name);
        adapter = new FeizaiListAdapter(this);
        rv.setAdapter(adapter);
        rv.setLayoutManager(new LinearLayoutManager(this));

        add.setOnClickListener(v -> {
    
    

            if (TextUtils.isEmpty(firstName.getText().toString()) && TextUtils.isEmpty(secondName.getText().toString())) {
    
    
                return;
            }

            feizai.setFirstName(firstName.getText().toString());
            feizai.setSecondName(secondName.getText().toString());
            mFeizaiViewModel.insert(feizai);
        });

        delete.setOnClickListener(v -> {
    
    
            if (TextUtils.isEmpty(firstName.getText().toString())) {
    
    
                return;
            }

            feizai.setFirstName(firstName.getText().toString());
            feizai.setSecondName(secondName.getText().toString());
            mFeizaiViewModel.delete(feizai);
        });

        update.setOnClickListener(v -> {
    
    
            if (TextUtils.isEmpty(firstName.getText().toString())) {
    
    
                return;
            }

            feizai.setFirstName(firstName.getText().toString());
            feizai.setSecondName(secondName.getText().toString());
            mFeizaiViewModel.update(feizai);
        });
    }
}
11. 렌더링

작업 추가, 삭제, 수정
추신: 초보자가 의심스러운 경우 공식 웹사이트로 이동하여 관련 세부 정보를 확인할 수 있습니다.

추천

출처blog.csdn.net/qq_36224961/article/details/109169330