Java 房间数据库-数据不存在';I don’我第一次没露面
当我在数据库类中填充数据时,我在MainActivity中从StudentDao调用了getAllStudents方法,但是当我运行应用程序时,我的textview第一次没有显示数据。当我第二次运行应用程序时,只有这次我的文本视图显示数据。有什么问题? 这是mycode: 学生班Java 房间数据库-数据不存在';I don’我第一次没露面,java,database,android-studio,android-asynctask,android-room,Java,Database,Android Studio,Android Asynctask,Android Room,当我在数据库类中填充数据时,我在MainActivity中从StudentDao调用了getAllStudents方法,但是当我运行应用程序时,我的textview第一次没有显示数据。当我第二次运行应用程序时,只有这次我的文本视图显示数据。有什么问题? 这是mycode: 学生班 @Entity(tableName = "students") public class Student { @PrimaryKey(autoGenerate = true) private int
@Entity(tableName = "students")
public class Student {
@PrimaryKey(autoGenerate = true)
private int ID;
private String name;
private String email;
private String phoneNumber;
public Student(String name, String email, String phoneNumber) {
this.name = name;
this.email = email;
this.phoneNumber = phoneNumber;
}
public void setID(int ID) {
this.ID = ID;
}
public int getID() {
return ID;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
public String getPhoneNumber() {
return phoneNumber;
}
学生道
@Dao
public interface StudentDAO {
@Insert
void InsertSingleStudent(Student student);
@Insert
void InsertAllStudents(List<Student> students);
@Delete
void DeleteSingleStudent(Student student);
@Update
void UpdateSingleStudent(Student student);
@Dao
公共接口StudentDAO{
@插入
void InsertSingleStudent(学生);
@插入
无效插入学生(列出学生);
@删除
无效的学生(学生);
@更新
无效更新单个学生(学生);
数据库类:
@Database(entities = {Student.class},version =1 ,exportSchema = false)
public abstract class UniDatabase extends RoomDatabase {
public abstract StudentDAO studentDAO();
private static UniDatabase instance;
public static synchronized UniDatabase getInstance(Context context) {
if (null==instance){
instance=Room.databaseBuilder(context,UniDatabase.class,"uni_db")
.fallbackToDestructiveMigration()
.allowMainThreadQueries()
.addCallback(initialCallback)
.build();
}
new PopulateInitialData(instance).execute();
return instance;
}
private static RoomDatabase.Callback initialCallback=new RoomDatabase.Callback()
{
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
}
};
private static class PopulateInitialData extends AsyncTask<Void,Void,Void> {
private StudentDAO studentDAO;
public PopulateInitialData(UniDatabase db) {
this.studentDAO=db.studentDAO();
}
@Override
protected Void doInBackground(Void... voids) {
ArrayList<Student> studentList=new ArrayList<>();
studentList.add(new Student("Cemal","cemal@gmail","555"));
studentList.add(new Student("Rıza","riza@gmail","123"));
studentDAO.InsertAllStudents(studentList);
return null;
}
}
}
@Database(entities={Student.class},version=1,exportSchema=false)
公共抽象类UniDatabase扩展了RoomDatabase{
公共摘要StudentDAO StudentDAO();
私有静态单数据库实例;
公共静态同步UniDatabase getInstance(上下文){
if(null==实例){
实例=Room.databaseBuilder(上下文,UniDatabase.class,“uni_db”)
.fallbackToDestructiveMigration()
.allowMainThreadQueries()
.addCallback(initialCallback)
.build();
}
新的PopulateInitialData(实例).execute();
返回实例;
}
私有静态RoomDatabase.Callback initialCallback=新建RoomDatabase.Callback()
{
@凌驾
public void onCreate(@NonNull SupportSQLiteDatabase db){
super.onCreate(db);
}
};
私有静态类PopulateInitialData扩展异步任务{
私人学生;
公众初始数据(UniDatabase db){
this.studentDAO=db.studentDAO();
}
@凌驾
受保护的空位背景(空位…空位){
ArrayList studentList=新建ArrayList();
学生列表。添加(新学生(“Cemal”)cemal@gmail","555"));
学生列表。添加(新学生(“Rıza”)riza@gmail","123"));
studentDAO.InsertAllStudents(学生名单);
返回null;
}
}
}
主要活动
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
UniDatabase db = UniDatabase.getInstance(MainActivity.this);
ArrayList<Student> students = (ArrayList<Student>)
db.studentDAO().getAllStudents();
String text = "";
for (Student s : students) {
text += "Id: " + s.getID() + "\nName: " + s.getName() + "\nEmail: " +
s.getEmail();
}
textView.setText(text);
}
}
public类MainActivity扩展了AppCompatActivity{
私有文本视图文本视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=findViewById(R.id.textView);
UniDatabase db=UniDatabase.getInstance(MainActivity.this);
ArrayList学生=(ArrayList)
db.studentDAO().getAllStudents();
字符串文本=”;
(学生:学生){
text++“Id:+s.getID()+”\n名称:+s.getName()+“\n邮件:”+
s、 getEmail();
}
textView.setText(text);
}
}
请参阅,如果您可以通过先从设备或模拟器中删除数据库,然后运行代码来重新创建该问题。如果再次发生这种情况,则您的数据库创建有问题
我认为,因为您的数据库正在异步任务中运行,它从不与主线程协调以让它知道数据已准备就绪。当您第二次运行应用程序时,数据已经存在,因为异步任务在您第一次运行时已完成。“第一次我的textview不显示数据”数据是第一次出现的吗?如果不是,那是一个问题。如果是的话,你可以从你的帖子中删除所有DAO内容,因为它不相关。我的意思是,当我第一次在我的设备上运行应用程序时,textview不会显示任何内容。但是当我关闭应用程序,并在我的Android设备上重新启动它时,textview这次会显示数据。谢谢你的帮助答:在我的Android设备中,在我从Android studio运行应用程序后,我清除了应用程序中的数据库,但问题是相同的。我是否也可能因为异步任务已被弃用而使用它?