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などのスレッドを使う必要があるのでしょう。