2016-09-21 2 views
0

Ich bin auf einem wirklich seltsamen Bug stecken. Ich habe einen Tisch Follower, und wenn ich Daten einfüge, funktioniert es, außer für den ersten Eintrag.Sqlite einfügen Linien Bug

Wenn ich die Funktion zum ersten Mal aufruft, wird nichts geworfen, und die Einfügefunktion kehrt wie erwartet zurück 1. Aber wenn ich die Funktion Alle auswählen aufruft, ist die Tabelle leer.

Wenn ich jedoch die Funktion ein anderes Mal mit anderen Parametern aufrufen, werden die Daten wirklich eingefügt und die Tabelle zeigt einen Eintrag (dieser) aber mit 2 als ID.

Ich verwende Sqldelight.

public long insertFollower(String name, String wca_id, long created_at) { 

    try { 
     SQLiteDatabase db = openDatabase(); 

     return db.insert(Follower.TABLE_NAME, null, Follower.FACTORY.marshal() 
       .name(name) 
       .wca_id(wca_id) 
       .created_at(created_at) 
       .asContentValues()); 
    } 

    catch (Exception e) { 
     e.printStackTrace(); 
    } 

    finally { 
     closeDatabase(); 
    } 

    return 0; 
} 

private static AtomicInteger openCount = new AtomicInteger(); 
private static SQLiteDatabase database; 

public static final String DATABASE_NAME = "database.db"; 
public static final int DATABASE_VERSION = 12; 

private static DatabaseHelper instance; 

public static synchronized DatabaseHelper getInstance(Context context) { 
    if(instance == null) { 
     instance = new DatabaseHelper(context); 
    } 

    return instance; 
} 

public synchronized SQLiteDatabase openDatabase() { 
    if(openCount.incrementAndGet() == 1) { 
     database = getWritableDatabase(); 
    } 

    return database; 
} 

public synchronized void closeDatabase() { 
    if(openCount.decrementAndGet() == 0) { 
     database.close(); 
    } 
} 


@Override 
public void onCreate(SQLiteDatabase db) { 

    db.execSQL(Follower.CREATE_TABLE); 
    db.execSQL(Record.CREATE_TABLE); 

} 

Und die Follower.CREATE_TABLE, die von sqldelight generiert wurde

String CREATE_TABLE = "" 
    + "CREATE TABLE follower (\r\n" 
    + " _id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\r\n" 
    + " name TEXT NOT NULL,\r\n" 
    + " wca_id TEXT NOT NULL\r\n" 
    + ")"; 

EDIT:

ich etwas bemerkt seltsam, die helfen können:

Dies funktioniert nur, wenn die Tabelle leer ist

Ich füge einen Follower ein, der nicht funktioniert. Aber wenn ich einen anderen Follower mit der gleichen ID wie die erste einfüge (es gibt einen Autoinkrement für den Primärschlüssel). Ich bekomme eine UNIQUE-Ausnahme, aber die Tabelle ist noch leer.

Zögern Sie nicht, weitere Informationen zu fragen.

Vielen Dank.

+0

Können Sie ein Tool wie SQLiteDebugger verwenden, um sicherzustellen, dass die Tabelle leer ist (im Gegensatz zu Ihrem Code Select Anweisung) –

+0

Hallo Al Lelopath, danke für deine schnelle Antwort. Ich denke, dass ich SqliteDebugger nicht verwenden kann, weil mein Telefon nicht gerootet ist und mein Computer ein Telefon nicht emulieren kann. :/ –

+0

Sind die Parameter wichtig? Z.B. Wenn Sie die Parameter des ersten und zweiten Inserts ändern, erhalten Sie immer noch den gleichen Fehler? Was ist mit einem dritten Einsatz, was macht er? Es kann sein, dass der 2. Einschub den ersten überschreibt. –

Antwort

0

finde ich endlich die Antwort dank @anstrong: den Folger I cursor.moveToFirst() verwendet, um auszuwählen und die while(cursor.moveToNext()) genannt wurde kurz nach