【问题标题】:Unable to delete table from room database无法从房间数据库中删除表
【发布时间】:2019-03-28 12:40:05
【问题描述】:

我已经在我的应用中实现了 Room Persistence Library。使用这个我 1.向表中添加数据 2.显示 3.删除表 我正在循环执行这三个步骤。 但这里的问题是表格内容只有在重新启动应用程序后才会被删除。意味着在我重新启动应用程序之前不会删除表数据。 我的代码在这里

添加、读取、显示数据库表

public void DatabaseTask{
for(getting data from web server){
//Adding them to database
 AddToDatabase addToDatabase=new AddToDatabase(file.getId(),file.getName(),"punith@gmail.com");
                addToDatabase.execute();
}
//Reading Table from Database
  ReadFromDatabase readFromDatabase=new ReadFromDatabase();
            readFromDatabase.execute();
//Deleting table from database
  DeleteFromDatabase deleteFromDatabase=new DeleteFromDatabase();
            deleteFromDatabase.execute();

}
This DatabaseTask class will be executed every 15 minutes

用于添加、读取、删除的异步任务类

 private class AddToDatabase extends AsyncTask<String,String,String>{
      String id;
      String name,email;
        public AddToDatabase(String id,String name, String email){
            this.id=id;
            this.name=name;
            this.email=email;

      }
        @Override
        protected String doInBackground(String... strings) {
            User user=new User();
            user.setId(id);
            user.setName(name);
            user.setEmail(email);
            MainActivity.myAppDatabase.myDao().addUser(user);
            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            Log.d("mPavan001", "add done");
            super.onPostExecute(s);
        }
    }
    private class ReadFromDatabase extends AsyncTask<String,String,String>{

        @Override
        protected String doInBackground(String... strings) {

            List<User> users=MainActivity.myAppDatabase.myDao().getUsers();
            for(User usr: users){
                String id=usr.getId();
                String name=usr.getName();
                String email=usr.getEmail();
                 info=info+"\n\n"+"id :"+id+"\n Name :"+name+"\n Email :"+email;
            }
            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            Log.d("mPavan001", "onPostExecute: "+info);
            super.onPostExecute(s);
        }
    }
    private class DeleteFromDatabase extends AsyncTask<String,String,String>{

        @Override
        protected String doInBackground(String... strings) {

            MainActivity.myAppDatabase.myDao().deleteAll();

            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            Log.d("mPavan001", "delete done");
            super.onPostExecute(s);
        }
    }

数据访问对象

@Dao
public interface MyDao {

    @Insert
    public void addUser(User user);

    @Query("select * from users")
    public List<User> getUsers();

    @Query("DELETE FROM users")
    public void deleteAll();
}

我该如何解决这个问题? 请询问您是否需要更多详细信息。

【问题讨论】:

    标签: java android android-room


    【解决方案1】:

    看起来您只是在删除数据,而不是监听它的变化。

    考虑使用LiveData 从数据库中获取数据,并在FragmentActivity 中观察LiveData。这样,您的视图将始终了解数据更改。

    另一件事是您可能在删除数据后手动检查数据更改。如果是这样:请发布您的代码块。

    【讨论】:

    • 好的,我会用实时数据检查它,顺便说一句,我已经用数据读取块更新了我的问题,
    • 能否请您在调用读取和删除数据的地方添加代码块?
    【解决方案2】:

    我犯了一个愚蠢的错误,我使用信息字符串来显示数据库表值。但我没有在每次循环迭代时将其设置为空。所以它也用来存储之前循环迭代的数据,即使数据库表被删除了!

    【讨论】:

    • 嘿,你能详细说明一下我面临同样的问题
    • @Moulesh 实际上数据库没有任何问题,我曾经使用循环将数据库值复制到字符串中,但我没有在每次循环迭代中清除字符串,因此它用于显示旧数据即使数据库是最新的。
    • 感谢更新我也解决了我的问题,这不是 db 的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多