【问题标题】:exception fetching last inserted id获取最后插入的 id 的异常
【发布时间】:2017-12-01 11:50:58
【问题描述】:

我想在 sqlite 中获取最后插入的行的 id,但是在获取它时没有出现异常。我已经发布了我的 sqlite 表,我想要获取 id 的方法和异常。我尝试了很多堆栈中的答案但没有用。请帮助我

public int getLastId() {
    int _id = 0;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query("calls", new String[] {BaseColumns._ID}, null, null, null, null, null);

    if (cursor.moveToLast()) {
        _id = cursor.getInt(0);
    }

    cursor.close();
    db.close();
    return _id;
}

异常

`E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.opentok.example.efflorescence.myaudiotranscription, PID: 20655
              android.database.sqlite.SQLiteException: no such column: _id (code 1): , while compiling: SELECT _id FROM calls

                  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:898)
                  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:509)
                  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                  at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
                  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
                  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1346)
                  at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1193)
                  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1064)
                  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1232)
                  at com.opentok.example.efflorescence.myaudiotranscription.database.DBHelper.getLastId(DBHelper.java:79)
                  at com.opentok.example.efflorescence.myaudiotranscription.AudioCallActivity$3.run(AudioCallActivity.java:199)
                  at android.os.Handler.handleCallback(Handler.java:815)
                  at android.os.Handler.dispatchMessage(Handler.java:104)
                  at android.os.Looper.loop(Looper.java:194)
                  at android.app.ActivityThread.main(ActivityThread.java:5637)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:372)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)`

我的 sqlite 表

public class DBHelper extends SQLiteOpenHelper {

public static final String DATABASE_NAME = "MyDBName.db";
public static final String CALLS_TABLE_NAME = "calls";
public static final String CALLS_COLUMN_ID = "id";
public static final String CALLS_COLUMN_NAME = "name";
public static final String CALLS_COLUMN_TIME = "time";
public static final String CALLS_COLUMN_TYPE = "type";
public int numRows;
ArrayList<String> array_list = new ArrayList<String>();

private HashMap hp;

public DBHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL(
            "create table calls " +
                    "(id integer primary key, name text,time text, type text,archiveId text)"
    );
}

【问题讨论】:

标签: android sqlite android-sqlite


【解决方案1】:

您正在尝试读取名为 _id 的列,但您实际拥有的列是 id

无论如何,与其读取所有表行,不如直接读取最后一个值会快得多:

long getLastId() {
    SQLiteDatabase db = this.getReadableDatabase();
    try {
        return DatabaseUtils.longForQuery(db,
                    "SELECT max(id) FROM calls", null);
    } finallly {
        db.close();
    }
}

【讨论】:

    【解决方案2】:

    您必须将主键列 id 更改为 _id 尝试以下代码

    public static final String CALLS_COLUMN_ID = "_id";//change here
    public static final String CALLS_COLUMN_NAME = "name";
    public static final String CALLS_COLUMN_TIME = "time";
    public static final String CALLS_COLUMN_TYPE = "type";
    public int numRows;
    ArrayList<String> array_list = new ArrayList<String>();
    
    private HashMap hp;
    
    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, 2);// also change db version
    }
    

    更改数据库版本

    【讨论】:

    • BaseColumns interface 没有名为 id 的成员。
    • 这是我在基列类中的字符串 public static final String _ID = "_id";我将 _id 更改为 id 但它显示相同的错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多