2017-10-15 11 views
0

問題は '' android.database.sqlite.SQLiteExceptionです:テーブルSCHOOLSUBJECTはSUBJECT(コード1)という名前のカラムがありません: '' 私のコードに何が問題なのですか? 私はいくつかのデータをデータベースに入れてそれを表示したいと思います。カラムとテーブル - SQLite

private static final int DATABASE_VERSION = 1; 
public static final String DATABASE_NAME = "SQLiteDatabase.db"; 
public static final String TABLE_NAME = "SCHOOLSUBJECT"; 
public static final String COLUMN_ID = "ID"; 
public static final String COLUMN_FIRST_NAME = "SUBJECT"; 
public SQLiteHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL("create table " + TABLE_NAME + " (" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_FIRST_NAME + " VARCHAR);"); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL(" DROP TABLE IF EXISTS " + TABLE_NAME); 
    onCreate(db); 
} 
public boolean addData(String item) 
{ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(COLUMN_FIRST_NAME,item); 

    Log.d(" DatabaseHelper","addData: Adding " + item + " to " + TABLE_NAME); 
    long result = db.insert(TABLE_NAME,null,contentValues); 
    db.close(); 
    if(result ==1) 
     return false; 
    else 
     return true 

} 
public String getData() 
{ 
    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null); 

    if (cursor != null) 
     cursor.moveToNext(); 

    String dataa = cursor.getString(1); 

    return dataa; 
} 
} 
+1

例外のスタックトレースと、例外をスローするコードを投稿してください。また、 'create table'ステートメントの終わりにセミコロンを削除してみてください。 –

+0

以前のテスト実行後に列を追加したか、その名前を変更しました。 –

+1

アプリを再インストールするか、データを消去してください。データベースが再度生成され、おそらく動作します。 @ModularSynthで述べたようにデータベースを変更した可能性があります –

答えて

0

あなたの最初の問題は、SQLiteOpenHelperサブクラスのonCreate方法は、専用データベース自体が作成されたときに呼び出される/実行されていることです。したがって、構造が変更された場合(たとえば、列、表などを追加する場合)、onCreateのコードに変更が加えられた場合、自動的には実行されません。

アプリケーションを開発し、データを迅速に周りを取得保管する必要はありませんが、アプリケーションのデータを削除するアプリの場合や、多くのコピードロップテーブル(複数可)をアンインストールしてのonCreateを呼び出すことのいずれかで符号化されますonUpgradeメソッドを使用して、バージョン番号を増やします。

2番目の問題は、db.queryメソッドがnullカーソルを返さず、返されたカーソルが空だったためです。

条件に一致する行がない場合(ケースの空のテーブル)、カーソルカウントは0になりますが、カーソルは有効になります。 if (cursor != null)ではなくif (cursor.moveToFirst)またはif (cursor.moveToNext)またはif (cursor.getCount() > 0)を使用してください。また、cursor.close()を使用して戻る前にカーソルを閉じる必要があります。

私はまた、ハードコーディングされたカーソルオフセットの使用を避けることをお勧めしますが、は難しいが、オフセット/インデックスをコード化され、あなたがに応じたオフセット/インデックスを取得するには、これを変更した場合、あなたは少数の問題がありそう遭遇するでString dataa = cursor.getString(1);を持っている、すなわち、列の名前これを行うには、使用することができます: -

String dataa = cursor.getString(cursor.getColumnIndex(COLUMN_FIRST_NAME)); 

私もpublic static final String COLUMN_ID = "_id";public static final String COLUMN_ID = "ID";を変更助言します。これは、時には_idの列が必要な場合があるため、事実上単純化することができます。 ListViewにCursorAdpaterを使用する場合(おそらく次のステップはすべてのデータをリストすることです)。

多くコピーしたINTEGER PRIMARY KEY AUTOINCREMENTをちょうどINTEGER PRIMARY KEYに変更することもお勧めします。 INTEGER PRIMARY KEYは通常ユニークな識別子を1つ増やしてユニークな値を返しますが、オーバーヘッドはAUTOINCREMENTであり、高い数値が保証されますが、コストはかかりません。

関連する問題