2016-04-15 9 views
1

Ich habe den folgenden Code:INTEGER PRIMARY KEY AUTOINCREMENT in Android funktioniert nicht

package com.example.mayur.myapplication; 

import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.Cursor; 
import android.content.Context; 
import android.content.ContentValues; 
import android.util.Log; 

import java.util.ArrayList; 


public class dbhandler extends SQLiteOpenHelper{ 

    private static final int DATABASE_VERSION = 1; 
    private static final String DATABASE_NAME="database1.db"; 
    private static final String TABLE_NAME= "Database"; 
    private static final String _ID="_id"; 
    private static final String COLUMN_NAME="Name"; 
    private static final String COLUMN_TITLE="Title"; 




    public dbhandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { 
     super(context, DATABASE_NAME, factory, DATABASE_VERSION); 
    } 


    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String query = "CREATE TABLE " + TABLE_NAME +" (_ID INTEGER PRIMARY KEY AUTOINCREMENT,COLUMN_Name TEXT, COLUMN_Title TEXT)"; 
     db.execSQL(query); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      db.execSQL("DROP TABLE IF EXISTS TABLE_NAME"); 
      onCreate(db); 
    } 
    public void addproduct(Database database) 
    { 
     ContentValues values=new ContentValues(); 
     values.put(COLUMN_TITLE,database.get_title()); 
     values.put(COLUMN_NAME,database.get_name());   
     SQLiteDatabase db=this.getWritableDatabase(); 
     db.insert(TABLE_NAME, null, values); 
     db.close(); 

    } 
    public void deleteproduct(String name) 
    { 
     SQLiteDatabase db =getWritableDatabase(); 
     db.execSQL("DELETE FROM " + TABLE_NAME + " WHERE " + COLUMN_NAME + "=\"" + name + "\"; "); 
    } 

    public ArrayList<Database> load() 
    { 
     Database d=new Database(); 
     ArrayList<Database> ret = new ArrayList<>(); 
     SQLiteDatabase db=getWritableDatabase(); 
     String query="SELECT * FROM " + TABLE_NAME + " WHERE 1"; 
     Cursor c=db.rawQuery(query,null); 
     c.moveToFirst(); 
     for(int i=0;i<c.getCount();i++) 
     { 
      d.set_name(c.getString(c.getColumnIndex("Name"))); 
      d.set_title(c.getString(c.getColumnIndex("Title"))); 
      ret.add(d); 
      c.moveToNext(); 

       Log.d("id", "load: "+ ret.get(i).get_id()); 
     } 
     db.close(); 

     return rSQLt; 
    } 
} 

logd zeigt immer id = 0 in der Load-Methode für alle Iterationen. Ich habe auch versucht, Autoincrement zu entfernen, aber es funktioniert nicht, da jedes Mal, wenn ich versuche, Daten aus der SQLite-Datenbank zu drucken, immer der letzte Eintrag gedruckt wird. Bitte helfen Sie.

Antwort

0

Sie sind nicht die _id in Ihrem Objekt Einstellung d -

Fügen Sie diese Zeile in Ihrer for loop -

d.set_id(c.getInt(c.getColumnIndex("_ID"))); 
0

Das Problem besteht darin, dass Ihre Spaltennamen zwischen dem Zeitpunkt, an dem Sie Ihre Datenbank erstellen, und dem Zeitpunkt, zu dem Sie einfügen, nicht übereinstimmen. so gibt es zwei Lösungen:

Entweder sind diese Variablen ändern:

private static final String COLUMN_NAME="COLUMN_Name"; 
private static final String COLUMN_TITLE="COLUMN_Title"; 

oder Ändern Sie den Code in onCreate:

String query = "CREATE TABLE " + TABLE_NAME +" (_ID INTEGER PRIMARY KEY AUTOINCREMENT,"+COLUMN_Name+" TEXT, "+COLUMN_Title+" TEXT)"; 
0

Nicht, dass es Ihr Problem, aber AUTOINCREMENT benötigt wird, kein haben automatisch erhöhendes Feld. Tatsächlich ist das Codieren von AUTOINCREMENT in den meisten Fällen insofern nachteilig, als es unnötige Overheads einführt. AUTOINCREMENT bedeutet eigentlich, diese Spalte innerhalb der gesamten Datenbank eindeutig zu machen.

Hier ist die Zusammenfassung der AUTOINCREMENT aus Autoincrement In SQLite

Zusammenfassung

The AUTOINCREMENT keyword imposes extra CPU, memory, disk space, and disk I/O overhead and should be avoided if not strictly needed. It 

ist in der Regel nicht benötigt.

In SQLite, a column with type INTEGER PRIMARY KEY is an alias for the ROWID (except in WITHOUT ROWID tables) which is always a 64-bit 

signierte Ganzzahl.

On an INSERT, if the ROWID or INTEGER PRIMARY KEY column is not explicitly given a value, then it will be filled automatically with an 

nicht verwendete ganze Zahl, in der Regel eine mehr als die größte ROWID derzeit in Einsatz. Dies gilt unabhängig davon, ob das Schlüsselwort AUTOINCREMENT verwendet wird oder nicht.

If the AUTOINCREMENT keyword appears after INTEGER PRIMARY KEY, that changes the automatic ROWID assignment algorithm to prevent the 

Wiederverwendung von ROWIDs über die gesamte Lebensdauer der Datenbank. Mit anderen Worten, der Zweck von AUTOINCREMENT ist, die Wiederverwendung von ROWIDs aus zuvor gelöschten Zeilen zu verhindern.