2012-03-15 23 views
0

私は、カスタムのcursorAdapterでリストビューをフィードしようとしています。android no such column:_id

私はこのエラーを取得する:ここでは、この行で03-16 03:25:39.968: E/AndroidRuntime(14552): Caused by: android.database.sqlite.SQLiteException: no such column: _id: , while compiling: SELECT _id, content_note FROM notes values.put(DataBaseHelper.DATABASEBASE_CONTENT_NOTE, note.getContent());

は私の2つの接続クラス

package com.android.database; 

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DataBaseHelper extends SQLiteOpenHelper{ 

    private static final String DATABASE_NAME = "db"; 
    public static final String DATABASE_TABLE_NOTE = "notes"; 
    public static final String DATABASE_ID_NOTE = "_id"; 
    public static final String DATABASE_CONTENT_NOTE = "content_note"; 

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

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE " + DATABASE_TABLE_NOTE + " (" + DATABASE_ID_NOTE + " INTEGER PRIMARY KEY, " + DATABASE_CONTENT_NOTE + " TEXT);"); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     android.util.Log.w("Constants", "Maj de la base, suppression de toutes les anciennes donnees"); 
     db.execSQL("DROP TABLE IF EXISTS Notes"); 
     onCreate(db); 
    } 

} 



    package com.android.database; 
import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 

public class NoteDataSource{ 

    private SQLiteDatabase database; 
    private DataBaseHelper dbHelper; 
    private String[] allColumns = { DataBaseHelper.DATABASE_ID_NOTE, 
      DataBaseHelper.DATABASE_CONTENT_NOTE }; 

    public NoteDataSource(Context context) { 
     dbHelper = new DataBaseHelper(context); 
    } 


    public void open() throws SQLException { 
     database = dbHelper.getWritableDatabase(); 
    } 

    public void close() { 
     dbHelper.close(); 
    } 

    public Cursor createNoteTop(String note) { 

     //recuperer le bon id 

//  int idNote = getFirstId().getId(); 
     int idNote = 1 ; 

     ContentValues values = new ContentValues(); 
     values.put(DataBaseHelper.DATABASE_ID_NOTE, idNote); 
     values.put(DataBaseHelper.DATABASE_CONTENT_NOTE, note); 
     long insertId = database.insert(DataBaseHelper.DATABASE_TABLE_NOTE, null, 
       values); 
     Cursor cursor = database.query(DataBaseHelper.DATABASE_TABLE_NOTE, 
       allColumns, DataBaseHelper.DATABASE_ID_NOTE + " = " + insertId, null, 
       null, null, null); 
     cursor.moveToFirst(); 
     return cursor; 
    } 

    public Cursor createNoteBottom(String note) { 

     //recuperer le bon id 

     int idNote = getLastId().getId(); 

     ContentValues values = new ContentValues(); 
     values.put(DataBaseHelper.DATABASE_ID_NOTE, idNote); 
     values.put(DataBaseHelper.DATABASE_CONTENT_NOTE, note); 
     long insertId = database.insert(DataBaseHelper.DATABASE_TABLE_NOTE, null, 
       values); 
     // To show how to query 
     Cursor cursor = database.query(DataBaseHelper.DATABASE_TABLE_NOTE, 
       allColumns, DataBaseHelper.DATABASE_ID_NOTE + " = " + insertId, null, 
       null, null, null); 
     cursor.moveToFirst(); 
     return cursor; 
    } 

    public void deleteNote(Note note) { 
     long id = note.getId(); 
     System.out.println("Note deleted with id: " + id); 
     database.delete(DataBaseHelper.DATABASE_TABLE_NOTE, DataBaseHelper.DATABASE_ID_NOTE 
       + " = " + id, null); 
    } 

    public Cursor getAllNotes() { 
     Cursor cursor = database.query(DataBaseHelper.DATABASE_TABLE_NOTE, 
       allColumns, null, null, null, null, null); 
     return cursor; 
    } 

    private Note getFirstId(){ 
     Note notes = new Note(); 
     Cursor cursor = database.query(DataBaseHelper.DATABASE_TABLE_NOTE, 
       allColumns, null, null, null, null, null); 
     cursor.moveToFirst(); 
     notes = cursorToNote(cursor); 

     return notes; 

    } 

    private Note getLastId(){ 

     Note notes = new Note(); 
     Cursor cursor = database.query(DataBaseHelper.DATABASE_TABLE_NOTE, 
       allColumns, null, null, null, null, null); 
     cursor.moveToLast(); 
     notes = cursorToNote(cursor); 

     return notes; 

    } 

    private Note cursorToNote(Cursor cursor) { 
     Note note = new Note(); 
     note.setId(cursor.getInt(0)); 
     note.setContent(cursor.getString(1)); 
     return note; 
    } 




} 

これは単純なことと私はすでに他の名前フィールドでベースを作成したという事実から来なければならないですそれはアップグレードされません。

ありがとうございました。

答えて

3

これは単純なものでなければなりません。これは、すでに他の名前フィールドでベースを作成していて、アップグレードしないという事実から来ている必要があります。

私はあなたが正しいと思います。データベースを変更するたびにバージョン番号を増やす必要があります。次に、トランジションを処理できるコードをonUpgradeに配置することができます。

private static final int DATABASE_VERSION = 2; 
public DataBaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

onUpgradeのスキーマは通常、スキーマはまた、あなたのアプリが破損したデータベースを得ることなく、新しいバージョンにアプリをアップグレードするためにインストールしているユーザーをできるようになりますアップグレードこの

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // it all started this way 
    if (oldVersion < 1) { 
     db.execSQL("CREATE TABLE supertable..."); 
    } 

    // in version 2 I decided that I need another table 
    if (oldVersion < 2) { 
     db.execSQL("CREATE TABLE cooltable..."); 
    } 

    // in version 3 I decided that the table is not required anymore 
    if (oldVersion < 3) { 
     db.execSQL("DROP TABLE cooltable..."); 
    } 
    // remember to increase DATABASE_VERSION if you add steps here. 
} 

のようなものです。

+0

これは私が得なかったことです。 –

1

_idフィールドにもAUTOINCREMENTプロパティがあることを確認してください。

私はあなたもそれを残すことができると思います。自動的に正しく追加されます。

一般的な概要はhereです。

+0

真実と重要なポイント。自動インクリメントキーの目的を捨てるので、 'values.put(DataBaseHelper.DATABASE_ID_NOTE、idNote);'を挿入/更新しないでください。 – zapl

関連する問題