AS Room編①解説~EditText欄にテキストを記入し、その下のボタンを押すと、データベースに登録され、その一覧が下記に表示される~

すべて同じディレクトリに入れてます。

MainActivity.java

package com.example.roomappli;

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.sql.Timestamp;
import java.util.List;

public class MainActivity extends AppCompatActivity {



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


TextView index = findViewById(R.id.index);
Button button = findViewById(R.id.button);
AppDatabase db = AppDatabaseSingleton.getInstance(getApplicationContext());
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new DataStoreAsyncTask(db,index).execute();
}
});
}

public class DataStoreAsyncTask extends AsyncTask<Void,Void,Integer> {
private AppDatabase db;
private TextView textView;
StringBuilder sb;

public DataStoreAsyncTask(AppDatabase db,TextView textView) {
this.db= db;
this.textView =textView;
}

@Override
protected Integer doInBackground(Void... voids) {
UserDao userDao = db.userDao();
EditText editText = findViewById(R.id.editText);
userDao.insert(new User(editText.getText().toString()));
sb = new StringBuilder();
List<User> atList = userDao.getAll();
for(User user: atList){
sb.append(user.getAccessTime()).append("\n");
}
return 0;
}

protected void onPostExecute(Integer code){
textView.setText(sb.toString());

}
}
}

User.java

package com.example.roomappli;


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

@Entity(tableName ="users")
public class User {
@PrimaryKey(autoGenerate = true)
@NonNull
@ColumnInfo(name = "user_id")
private int user_id;

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

public User(String accessTime) {
this.accessTime = accessTime;
}

public int getUser_id() {
return user_id;
}

public void setUser_id(int user_id) {
this.user_id = user_id;
}

public String getAccessTime() {
return accessTime;
}

public void setAccessTime(String accessTime) {
this.accessTime = accessTime;
}
}

UserDao(注:これはインターフェースです)

package com.example.roomappli;

import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;

import java.util.List;

@Dao
public interface UserDao {
@Insert
void insertAll(User... users);

@Insert
void insert(User user);

@Delete
void delete(User user);

@Query("SELECT * FROM users")
List<User> getAll();
}

AppDatabase.java( RoomDatabaseを継承した抽象クラス)

package com.example.roomappli;

import androidx.room.Database;
import androidx.room.RoomDatabase;

@Database(entities = {User.class},version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}

AppDatabaseSingleton.java

package com.example.roomappli;

import android.content.Context;

import androidx.room.Room;

public class AppDatabaseSingleton {
private static AppDatabase instance = null;

static AppDatabase getInstance(Context context){
instance = Room.databaseBuilder(context,AppDatabase.class,"dtabase-name").build();
return instance;
}
}

あとは build.gradle(Module)に追記が必要です。

dependenciesの{}内にどこでもよいので下記を追記します。

      def room_version = "2. 2. 6"

      implementation "androidx.room:room-runtime:$room_version"

      annotationProcessor "androidx.room:room-compiler:$room_version"

 

そのあと、右上に表示される Sync nowを押すとできます。

 

 

改変の余地はありそうですが、何とか実行できるようです。

 

あとは、API30以上だと、AsyncTaskが非推奨になっているようです。その場合は、おそらく、JavaのRunnableやCallableなどのスレッドを使う必要があるのでしょう。