私はデータベースを初めて使いました。エントリを作成するときにデータベースを設定しようとしていますが、作成された日付(たとえば、 "December 23、2011)としてListViewに表示され、それをクリックして、 。特定の日付のすべてのエントリを表示する方法、SQLite - Android
public class DbAdapter
{
private static final String TAG = "DbAdapter";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private static final String DATABASE_CREATE =
"create table entry (_id integer primary key autoincrement, "
+ "date text UNIQUE, " +
"velocity integer not null, " +
"type text not null, " +
"xCoord real not null, " +
"yCoord real not null, " +
"color integer not null);";
private static final String DATABASE_NAME = "data";
private static final String DATABASE_TABLE = "entry";
private static final int DATABASE_VERSION = 2;
private final Context mCtx;
private SQLiteStatement insertStmt;
private static final String INSERT = "insert into " + DATABASE_TABLE + "(date) values (?)";
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS entry");
onCreate(db);
}
}
public DbAdapter(Context ctx)
{
this.mCtx = ctx;
}
public DbAdapter open() throws SQLException
{
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
this.insertStmt = this.mDb.compileStatement(INSERT);
return this;
}
public void close()
{
mDbHelper.close();
}
public long addEntry(String date, int velocity, String type, float xCoord, float yCoord, int color)
{
ContentValues initialValues = new ContentValues();
initialValues.put("date", date);
initialValues.put("velocity", velocity);
initialValues.put("type", type);
initialValues.put("xCoord", xCoord);
initialValues.put("yCoord", yCoord);
initialValues.put("color", color);
return mDb.insert(DATABASE_TABLE, null, initialValues);
}
public boolean deleteEntry(long rowId)
{
return mDb.delete(DATABASE_TABLE, "_id" + "=" + rowId, null) > 0;
}
public Cursor fetchAllEntries()
{
return mDb.query(DATABASE_TABLE, new String[] {"_id", "date", "velocity",
"type", "xCoord", "yCoord", "color"}, null, null, null, null, null);
}
public Cursor fetchEntry(long rowId) throws SQLException
{
Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {"_id", "date",
"velocity", "type"}, "_id" + "=" + rowId, null,
null, null, null, null);
if (mCursor != null)
{
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor fetchInfo(long rowId) throws SQLException
{
Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {"_id", "velocity", "xCoord", "yCoord", "color"}, "_id" + "=" + rowId, null, null, null, null, null);
if(mCursor != null)
{
mCursor.moveToFirst();
}
return mCursor;
}
}
これは私が作る最初のエントリのために正常に動作しますが、私はその特定の日のためのより多くのエントリを作成することはできませんが、それは私に言って、エラーを与える:その日に作成されたこれは、私がこれまで持っているものです。私はすでに値を持つ行に値を挿入しようとしているため、このエラーが起こっていることを知っている。私の質問があるので、私は目の中に複数の値を挿入することができますどのように
12-23 09:22:16.460: E/Database(272): Error inserting velocity=17 yCoord=121.0 xCoord=344.0 color=3 type=UNFINISHED date=December 23, 2011
12-23 09:22:16.460: E/Database(272): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
12-23 09:22:16.460: E/Database(272): at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
12-23 09:22:16.460: E/Database(272): at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:55)
12-23 09:22:16.460: E/Database(272): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1549)
12-23 09:22:16.460: E/Database(272): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1410)
12-23 09:22:16.460: E/Database(272): at com.x17.projects.strikezone.DbAdapter.addEntry(DbAdapter.java:96)
12-23 09:22:16.460: E/Database(272): at com.x17.projects.strikezone.Tab1$2.onClick(Tab1.java:121)
12-23 09:22:16.460: E/Database(272): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:158)
12-23 09:22:16.460: E/Database(272): at android.os.Handler.dispatchMessage(Handler.java:99)
12-23 09:22:16.460: E/Database(272): at android.os.Looper.loop(Looper.java:123)
12-23 09:22:16.460: E/Database(272): at android.app.ActivityThread.main(ActivityThread.java:4627)
12-23 09:22:16.460: E/Database(272): at java.lang.reflect.Method.invokeNative(Native Method)
12-23 09:22:16.460: E/Database(272): at java.lang.reflect.Method.invoke(Method.java:521)
12-23 09:22:16.460: E/Database(272): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-23 09:22:16.460: E/Database(272): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-23 09:22:16.460: E/Database(272): at dalvik.system.NativeStart.main(Native Method)
それが作成された日付。私は使用されていない挿入ステートメントを持っています。どこでどのように使用するのか分からず、正しいのかどうかわかりません。私がこれに慣れていないので、正しい方向へのちょっとしたポイントが役立ちます。
ありがとうございます。
UPDATE:
private static final String INSERT = "INSERT INTO " + DATABASE_TABLE + "(date, velocity, type, xCoord, yCoord, color) VALUES (?,?,?,?,?,?)";
と私はこのような値を挿入しています:
public long addEntry(String date, int velocity, String type, float xCoord, float yCoord, int color)
{
this.insertStmt.bindString(1, date);
this.insertStmt.bindLong(2, velocity);
this.insertStmt.bindString(3, type);
this.insertStmt.bindDouble(4, xCoord);
this.insertStmt.bindDouble(5, yCoord);
this.insertStmt.bindLong(6, color);
return this.insertStmt.executeInsert();
}
私は、私はすべての列から "ヌルではない" を取り出し、に私のINSERT文を変更し それでも同じ「エラーコード19:制約に失敗しました」というエラーが発生します。
12-23 11:36:03.343: E/AndroidRuntime(418): FATAL EXCEPTION: main
12-23 11:36:03.343: E/AndroidRuntime(418): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
12-23 11:36:03.343: E/AndroidRuntime(418): at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
12-23 11:36:03.343: E/AndroidRuntime(418): at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:81)
12-23 11:36:03.343: E/AndroidRuntime(418): at com.x17.projects.strikezone.DbAdapter.addEntry(DbAdapter.java:86)
12-23 11:36:03.343: E/AndroidRuntime(418): at com.x17.projects.strikezone.Tab1$2.onClick(Tab1.java:120)
12-23 11:36:03.343: E/AndroidRuntime(418): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:158)
12-23 11:36:03.343: E/AndroidRuntime(418): at android.os.Handler.dispatchMessage(Handler.java:99)
12-23 11:36:03.343: E/AndroidRuntime(418): at android.os.Looper.loop(Looper.java:123)
12-23 11:36:03.343: E/AndroidRuntime(418): at android.app.ActivityThread.main(ActivityThread.java:4627)
12-23 11:36:03.343: E/AndroidRuntime(418): at java.lang.reflect.Method.invokeNative(Native Method)
12-23 11:36:03.343: E/AndroidRuntime(418): at java.lang.reflect.Method.invoke(Method.java:521)
12-23 11:36:03.343: E/AndroidRuntime(418): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-23 11:36:03.343: E/AndroidRuntime(418): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-23 11:36:03.343: E/AndroidRuntime(418): at dalvik.system.NativeStart.main(Native Method)
私は間違っていますか?
私は一意に取ってみましたが、私はまだ同じエラーが発生します。私はリストビューで日付を1回だけリストしたいと思う。たとえば、私はその日付のために作成するすべてのエントリについて、 "2011年12月23日"をlistViewに表示したくありません。代わりに、その日に作成されたすべてのエントリを、その1つの日付をクリックするだけで表示したいとします。 – user990230
あなたはまだ挿入クエリでエラーが発生していますか?おそらくあなたのフィールドの値を指定しておらず、それらのフィールドをnullにすることができないようにテーブルを作成したからでしょう。私はこれを反映するために私の答えを編集します... –
私はちょうど私の質問を更新しました、あなたの助けを今までにありがとう。 – user990230