2011-12-23 3 views
2

Я новичок в базах данных, поэтому просто несите меня. Я пытаюсь настроить мою базу данных при создании записи, она отображается в ListView в качестве даты, когда она была создана (например, «23 декабря 2011 г.), а затем вы можете щелкнуть по ней и увидеть все, что у вас было . создано в тот же день это то, что я до сих пор:Как просмотреть все записи за определенную дату, 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) 

Я знаю, что эта ошибка происходит потому, что я пытаюсь вставить значение в строку, которая уже имеет значение. Так что мой вопрос, как я могу вставить несколько значений в пределах я e дата, когда она была создана. У меня есть оператор insert, который не используется, потому что я не знаю, где и как его использовать, и я не уверен, что это правильно. Поскольку я новичок в этом, полезной будет только точка в правильном направлении.

Заранее спасибо.

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(); 
    } 

Я все еще получая ошибку «ошибка кода 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) 

Что я делаю неправильно?

ответ

2

Я подозреваю, что проблема с датой «UNIQUE» является проблемой для вас, если вы удалите UNIQUE, тогда вы сможете вставить несколько записей с одинаковой датой - если я правильно вас понимаю.

Задача 2: если вы задали свои поля в базе данных как «not null», тогда вы должны указать значения для этих полей в вашем «insert». В настоящее время вы устанавливаете только поле даты в своем заявлении insert. Таким образом, вам нужно либо указать значения для всех своих полей в вашем «insert», либо вам нужно удалить «не нулевые» спецификации в вашей таблице.

Чтобы получить даты для вашего списка, вам нужно будет сделать какой-то запрос SELECT, возможно сгруппированный по дате, чтобы вы получили только одну строку за день. Что-то вроде этого должно работать:

SELECT * from table GROUP BY date 
+0

Я попытался вынуть уникальный, но я все равно получаю ту же ошибку. Я хочу только один раз указать даты в спискеView. Так, например, я не хочу, чтобы «23 декабря 2011» отображался в спискеView для каждой записи, созданной для этой даты. Вместо этого я хочу просмотреть все записи, созданные в этот день, просто нажав на эту дату. – user990230

+0

Вы по-прежнему получаете ошибку в своем запросе на вставку? Возможно, потому, что вы не указали значения своих полей - и вы создали таблицу, чтобы эти поля не могли быть нулевыми. Я отредактирую свой ответ, чтобы отразить это ... –

+0

Я только что обновил свой вопрос, спасибо за вашу помощь. – user990230

Смежные вопросы