2017-12-01 2 views
-3

Ich möchte ID der letzten eingefügten Zeile in SQLite erhalten, aber ich bekomme Ausnahme keine solche Spalte auf es abrufen.Ich habe meine SQLite-Tabelle, die Methode, wo ich Id und die Ausnahme holen wollen geschrieben .Ich versuchte eine Menge Antworten in Stapel aber nicht use.please helfen mirException fetching zuletzt eingefügte 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; 
} 

Ausnahme

`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)` 

meine sQLite Tabelle

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)" 
    ); 
} 
+0

'id integer Primär key' - Ihr' id' Spaltenname hat keinen Unterstrich. 'BaseColumns._ID' tut das. Korrigieren Sie entweder Ihre Abfrage oder korrigieren Sie die Anweisung 'CREATE TABLE'. –

+0

https://stackoverflow.com/questions/9902394/how-to-get-last-record-from-sqlite überprüfen Sie diese – user7176550

+0

@ user7176550 Diese Frage ist nicht für den letzten Datensatz, sondern nur für die letzte ID-Wert. –

Antwort

0

Sie versuchen, eine Spalte mit dem Namen _id zu lesen, aber die Spalte, die Sie tatsächlich haben, ist id.

Wie auch immer, anstatt alle Tabellenzeilen zu lesen, wäre es viel schneller sein, nur direkt den letzten Wert lesen:

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

Thanks.that arbeitete – user8601021

0

Sie müssen Primärschlüssel Spalten id zu _id Code unten versuchen ändern

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 
} 

Änderung db Version

+0

Die [BaseColumns' Schnittstelle] (https://developer.android.com/reference/ android/provider/BaseColumns.html) hat kein Mitglied mit dem Namen "id". –

+0

Dies ist meine String in Base Columns Klasse öffentliche statische letzte String _ID = "_id"; ich änderte _id zu ID, aber es zeigt den gleichen Fehler – user8601021

+0

@ user8601021 versuchen, aktualisierten Code .. – Omi

Verwandte Themen