【问题标题】:Unable to decrement an Int value in Android SQLite DB无法减少 Android SQLite DB 中的 Int 值
【发布时间】:2014-07-16 21:02:22
【问题描述】:

我正在尝试增加 SQLite DB (Android) 中的值,但我在 logcat 中收到“没有这样的表”的致命错误,并且应用程序崩溃了。但是,该表存在于数据库中。我的代码可能有问题吗?任何帮助将不胜感激。这是我的更新代码和 logcat 输出。

a) 更新代码

public void tupdateDaysLeft(){
    if (daysLeftCur == null) {
        daysLeftCur = findDaysLeft();
    }

    if (daysLeftCur.moveToFirst()) {
        int columnIndex = daysLeftCursor.getColumnIndex(MsDbAdapter.COL_DAYSLEFT);
        int daysToDel = daysLeftCur.getInt(columnIndex);

    //  int stt = daysToDel;
    //  daysle  = stt;

    mDb.execSQL("UPDATE "+TABLE_PRE+
                " SET "+COL_DAYSLEFT+" = "+COL_DAYSLEFT+" - 1"+
                " WHERE "+COL_ID+" = ?",
                new Object[] { columnIndex });
    }
}

b)-i Logcat 输出 1

07-16 23:43:36.938: E/SQLiteLog(20992): (1) no such table: TABLE_PRE
07-16 23:43:36.948: E/AndroidRuntime(20992): FATAL EXCEPTION: main
07-16 23:43:36.948: E/AndroidRuntime(20992): android.database.sqlite.SQLiteException: no such table: TABLE_PRE (code 1): , while compiling: update 

TABLE_PRE set COL_DAYSLEFT = COL_DAYSLEFT + 1 where COL_ID = ?
07-16 23:43:36.948: E/AndroidRuntime(20992):    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
07-16 23:43:36.948: E/AndroidRuntime(20992):    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1013)
07-16 23:43:36.948: E/AndroidRuntime(20992):    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:624)
07-16 23:43:36.948: E/AndroidRuntime(20992):    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
07-16 23:43:36.948: E/AndroidRuntime(20992):    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)

b)-ii Logcat 输出 2

01-01 06:31:37.701: E/AndroidRuntime(6357): FATAL EXCEPTION: main
01-01 06:31:37.701: E/AndroidRuntime(6357): java.lang.NullPointerException
01-01 06:31:37.701: E/AndroidRuntime(6357): at com.tembk.mspre.database.MsDbAdapter.tupdateDaysLeft(MsDbAdapter.java:292)
01-01 06:31:37.701: E/AndroidRuntime(6357): at com.tembk.mspre.pre.PreStatus$3.onClick(PreStatus.java:79)

c) 表定义

private static final String TABLE_PRE = "pre";

编辑

d) 表常量/字段

private static final String TABLE_PRE = "pre";
public static final String COL_ID = "_id";
public static final String COL_BEGINDATE = "begindate";
public static final String COL_TERMEND = "termend";
public static final String COL_DAYSLEFT = "daysleft";
public static final String COL_DATE_TIME = "pre_date_time";

e) 表创建 SQL

private static final String PRE_TABLE_CREATE =
    "create table " + TABLE_PRE + " ("
            + COL_ID + " integer primary key autoincrement, "
            + COL_BEGINDATE + " text not null, "
            + COL_TERMEND + " text not null, "
            + COL_DAYSLEFT + " integer not null, "
            + COL_DATE_TIME + " text not null " + ")";

【问题讨论】:

  • 发布表pre的创建语句
  • @Apoorv,我已经编辑了代码以包含 FIELD NAMES 和 CREATE 语句。检查“编辑”。

标签: android database sqlite sql-update


【解决方案1】:

数据库不知道你的Java代码中有TABLE_PREdaysle的符号;你必须用 Java 替换它们。

另外,COL_ID 很可能是 ID 列的name,但需要与所需记录中的value进行比较。

mDb.execSQL("UPDATE "+TABLE_PRE+
            " SET "+COL_DAYSLEFT+" = ?"+
            " WHERE "+COL_ID+" = ?",
            new Object[] { daysle + 1, idOfTheRowToUpdate });

但是,要增加值,您不需要在代码中读取旧值;您可以直接在 SQL 中进行添加:

mDb.execSQL("UPDATE "+TABLE_PRE+
            " SET "+COL_DAYSLEFT+" = "+COL_DAYSLEFT+" + 1"+
            " WHERE "+COL_ID+" = ?",
            new Object[] { idOfTheRowToUpdate });

【讨论】:

  • @CL.,目前看起来很有希望,让我试一试。
  • 我已经尝试了你的建议,现在我在上面的 Logcat 输出 2 中得到了错误。
  • 列索引不是ID值,但这与NPE无关。 mDb 为空,但这是另一个问题。
【解决方案2】:

我通过使用内容值解决了这个问题。我在数据库适配器中创建了一个方法,并在传递我需要的值的主要活动中调用它。它看起来很粗糙,但效果很好。

1) 数据库适配器更新方法

public boolean updatePreDL(Object mRowId, int daysleft, String preDateTime) {
    ContentValues newValues = new ContentValues();
    newValues.put(COL_DAYSLEFT, daysleft);
    newValues.put(COL_DATE_TIME, preDateTime);
    return mDb.update(TABLE_PRE, newValues, COL_ID + "=" + mRowId, null) > 0;
}

2) Button Click call(上述DB Adapter Update Method)

updateDays.setOnClickListener( new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            mDbHelper.updatePreDL(MsDbAdapter.COL_ID, 
                    daysLeftCur.getInt(daysLeftCur.getColumnIndex(MsDbAdapter.COL_DAYSLEFT))-1, 
                    MsDbAdapter.COL_DATE_TIME);
        }
    });

【讨论】:

    【解决方案3】:

    我认为你应该使用这个:

    mDb.execSQL("update TABLE_PRE set COL_DAYSLEFT = "+ (daysle + 1) +"  where COL_ID = ?", new Object[] {COL_ID});
    }
    

    而不是这个:

    mDb.execSQL("update TABLE_PRE set COL_DAYSLEFT = daysle + 1 where COL_ID = ?", new Object[] {COL_ID});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2016-05-05
      • 2015-10-31
      • 2022-06-23
      • 1970-01-01
      相关资源
      最近更新 更多