【问题标题】:Android SQLite - second update always return 0Android SQLite - 第二次更新总是返回 0
【发布时间】:2015-05-18 13:28:43
【问题描述】:

我一直在使用 SQLite Android,每当我第二次尝试更新表时都会出错,而且我不知道我的代码有什么问题。第一次更新运行良好。

谁能告诉我我做错了什么?提前致谢。

这是我用来更新表格的函数:

public boolean updateEvents(int id, boolean shown){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();

    contentValues.put(EVENTS_COLUMN_SHOWN, shown);

    int result = db.update(EVENTS_TABLE_NAME, contentValues, EVENTS_COLUMN_ID_EVENTS + " = ?", new String[]{Integer.toString(id)});
    Log.d(DBHelper.class.getSimpleName(),"update result: "+result);
    return result==1;
}

我在完成 AsyncTask 类中的 doInBackground() 后调用该函数。 这是调用该更新函数的类:

private class GetEvents extends AsyncTask<Void,Void,Events>{
        private DBHelper dbHelper;
        @Override
        protected Events doInBackground(Void... voids) {
            try{
                if(new Connection().GetEvents() && Settings.events.size()>0){
                    dbHelper = new DBHelper(FirstActivity.this);
                    for(int i=0; i<Settings.events.size(); i++){
                        dbHelper.recordEvents(Settings.events.get(i),dbHelper.isEventsShown(Settings.events.get(i).id_event));
                    }
                    for(int a=0; a<Settings.events.size(); a++){
                        boolean shown = dbHelper.isEventsShown(Settings.events.get(a).id_event);
                        Log.d(FirstActivity.class.getSimpleName(),"shown "+a+": "+shown);
                        if(Settings.events.get(a).isEnabled() && Settings.events.get(a).isEventValid() && !shown){
                            return Settings.events.get(a);
                        }
                    }
                }
            }catch (Exception e){
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Events events) {
            if(events!=null){
                dbHelper.updateEvents(events.id_event, true);
                showPopUp(events);
            }
            super.onPostExecute(events);
        }
    }

【问题讨论】:

  • 您能否解释一下您的退货在 updateEvents 中的作用和方式?
  • 您是否检查过第一次和第二次更新的 events.id_event 是否相同?
  • @Thealon 如果 db.update 返回 1 并且我的带有指定 event_id 的事件表已更新,则它可以工作。它在第一次更新时工作,它返回 1 并且我的表已更新。但第二次更新失败,我的数据没有改变。
  • 第二次更新的表中是否存在events.id_event的值?
  • @dora 是的。如该代码所示,我有一些事件。首先,我将所有事件记录(插入)到数据库中。然后我检查之前是否显示过每个事件,如果没有,它将将该事件返回到 onPostExecute 并将“shown_column”更新为“true”。做事。

标签: android sqlite


【解决方案1】:

我不确定我是否理解你想要达到的目标,但我试了一下。试试下面的代码,让我知道。

private class GetEvents extends AsyncTask<Void,Void,ArrayList<Events>>{
private DBHelper dbHelper;
@Override
protected Events doInBackground(Void... voids) {
    ArrayList<Events> pendingEvents = new ArrayList<Events>();
    try{
        if(new Connection().GetEvents() && Settings.events.size()>0){
            dbHelper = new DBHelper(FirstActivity.this);
            for(int i=0; i<Settings.events.size(); i++){
                dbHelper.recordEvents(Settings.events.get(i),dbHelper.isEventsShown(Settings.events.get(i).id_event));
            }
            for(int a=0; a<Settings.events.size(); a++){
                boolean shown = dbHelper.isEventsShown(Settings.events.get(a).id_event);
                Log.d(FirstActivity.class.getSimpleName(),"shown "+a+": "+shown);
                if(Settings.events.get(a).isEnabled() && Settings.events.get(a).isEventValid() && !shown){
                    pendingEvents.add(Settings.events.get(a));
                   // return Settings.events.get(a);
                }
            }
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    return pendingEvents;
}

@Override
protected void onPostExecute(ArrayList<Events> events) {
    if(events!=null){
        for(Events events1:events){
        dbHelper.updateEvents(events1.id_event, true);
        }
        showPopUp(events);
    }
    super.onPostExecute(events);
}
}

问题(如果我理解正确的话)是,一旦发现一个事件,您就会返回 doInBackground 方法。这就是为什么我将所有此类事件放在一个列表中,如果它在迭代完 Settings.events 的完整列表后返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 2012-11-21
    • 2015-10-01
    • 1970-01-01
    • 2014-05-30
    相关资源
    最近更新 更多