AS Room編➂問題~AsyncTaskはAPI30以上で非推奨のため、Runnableで別スレッド利用して改変~
Try1. 下記は改変前です。Runnableで改変してください。
MainActivity.java
package com.example.singleroomrunnable;
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 showData = findViewById(R.id.showData);
Button registerBtn = findViewById(R.id.registerBtn);
AppDatabase db = AppDatabaseSingleton.getInstance(getApplicationContext());
registerBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new DataStoreAsyncTask(db,showData).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 editName = findViewById(R.id.editName);
userDao.insert(new User(editName.getText().toString()));
sb = new StringBuilder();
List<User> atList = userDao.getAll();
for(User user: atList){
sb.append(user.getName()).append("\n");
}
return 0;
}
protected void onPostExecute(Integer code){
textView.setText(sb.toString());
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".MainActivity"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="名前:"/>
<EditText
android:id="@+id/editName"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/registerBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登録"/>
<TextView
android:id="@+id/showData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
User.java
package com.example.singleroomrunnable;
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 = "id")
private int id;
@ColumnInfo(name = "name")
private String name;
public User(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
UserDao(インターフェース)
package com.example.singleroomrunnable;
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
package com.example.singleroomrunnable;
import androidx.room.Database;
import androidx.room.RoomDatabase;
@Database(entities = {User.class},version = 1,exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
AppDatabaseSingleton.java
package com.example.singleroomrunnable;
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,"db-name").build();
return instance;
}
}
あとは、build.gradle(Module)へ下記追記
def room_version = "2.2.6"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
dependencies {
def room_version = "2.2.6"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.google.android.material:material:1.7.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.4'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
}