2013-05-09 19 views
0

我正在嘗試使用DatePicker更新我的SQLite數據庫與日期字段。爲了簡單起見(就我而言),我決定只取日期並將它傳遞給一個字符串,以僅使用字符串來更新數據庫(我不希望在此實例中執行任何DATETIME函數)。Android數據庫SQLite日期可能不爲空

datbase工作至少,通過但是當數據被轉換爲一個TextView沒有出現,還蝕堆棧跟蹤一個對話框我的設置)報告如下:

05-09 22:47:30.164: E/SQLiteDatabase(3112): Error inserting chest=100 [email protected] legs=100 waist=100 weight=100 
05-09 22:47:30.164: E/SQLiteDatabase(3112): android.database.sqlite.SQLiteConstraintException: personalStats.date may not be NULL (code 19) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:775) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at com.uhi.fatfighter.Stats.createEntry(Stats.java:86) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at com.uhi.fatfighter.MainActivity.onClick(MainActivity.java:250) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at android.view.View.performClick(View.java:4084) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at android.view.View$PerformClick.run(View.java:16966) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at android.os.Handler.handleCallback(Handler.java:615) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at android.os.Handler.dispatchMessage(Handler.java:92) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at android.os.Looper.loop(Looper.java:137) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at android.app.ActivityThread.main(ActivityThread.java:4928) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at java.lang.reflect.Method.invoke(Method.java:511) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558) 
05-09 22:47:30.164: E/SQLiteDatabase(3112):  at dalvik.system.NativeStart.main(Native Method) 

下面是其中的SQL被處理的類:

public class Stats { 

    public static final String KEY_ROWID = "_id"; 
    public static final String KEY_WEIGHT = "weight"; 
    public static final String KEY_WAIST = "waist"; 
    public static final String KEY_CHEST = "chest"; 
    public static final String KEY_LEGS = "legs"; 
    public static final String KEY_ARMS = "arms"; 
    public static final String KEY_DATE = "date"; 



    private static final String DATABASE_NAME = "statsDB"; 
    private static final String DATABASE_TABLE = "personalStats"; 
    private static final int DATABASE_VERSION = 4; 

    private DbHelper ffHelper; 
    private final Context ffContext; 
    private SQLiteDatabase ffDatabase; 

    private static class DbHelper extends SQLiteOpenHelper { 

     public DbHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 

     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 

      db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + KEY_ROWID 
        + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_WEIGHT 
        + " TEXT NOT NULL, " + KEY_WAIST + " TEXT NOT NULL, " 
        + KEY_CHEST + " TEXT NOT NULL, " + KEY_LEGS 
        + " TEXT NOT NULL, " + KEY_ARMS + " TEXT NOT NULL," 
        + KEY_DATE + " TEXT NOT NULL);"); 

     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
      onCreate(db); 

     } 
    } 

    public Stats(Context c) { 
     ffContext = c; 
    } 

    public Stats open() throws SQLException { 
     ffHelper = new DbHelper(ffContext); 
     ffDatabase = ffHelper.getWritableDatabase(); 
     return this; 

    } 

    public void close() { 
     ffHelper.close(); 

    } 

    public long createEntry(String weight, String waist, String chest, String legs, String arms, String date) { 


     ContentValues cv = new ContentValues(); 
     cv.put(KEY_WEIGHT, weight); 
     cv.put(KEY_WAIST, waist); 
     cv.put(KEY_CHEST, chest); 
     cv.put(KEY_LEGS, legs); 
     cv.put(KEY_ARMS, arms); 
     cv.put(KEY_ARMS, date); 

     return ffDatabase.insert(DATABASE_TABLE, null, cv); 

    } 

    public String getData() { 
     String[] columns = new String[] { KEY_ROWID, KEY_WEIGHT, KEY_WAIST, KEY_CHEST, KEY_LEGS, KEY_ARMS, KEY_DATE}; 
     Cursor c = ffDatabase.query(DATABASE_TABLE, columns, null, null, null, 
       null, null); 
     String result = ""; 
     int iRow = c.getColumnIndex(KEY_ROWID); 
     int iWeight = c.getColumnIndex(KEY_WEIGHT); 
     int iWaist = c.getColumnIndex(KEY_WAIST); 
     int iChest = c.getColumnIndex(KEY_CHEST); 
     int iLegs = c.getColumnIndex(KEY_LEGS); 
     int iArms = c.getColumnIndex(KEY_ARMS); 
     int iDate = c.getColumnIndex(KEY_DATE); 

     for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { 
      result = result + c.getString(iRow) + " " + c.getString(iWeight) 
        + " " + c.getString(iWaist) 
        + " " + c.getString(iChest) 
        + " " + c.getString(iLegs) 
        + " " + c.getString(iArms) 
        + " " + c.getString(iDate)+ "\n"; 

     } 

     return result; 
    } 
} 

視圖類:

public class DBView extends Activity { 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.view_stats); 
     TextView tv = (TextView) findViewById(R.id.tvDBInfo); 
     Stats dbInfo = new Stats(this); 
     dbInfo.open(); 

     String data = dbInfo.getData(); 
     dbInfo.close(); 

      tv.setText(data); 



    } 

EditTexts和DatePicker在我的main_activity,我可以發佈,如果它會幫助?

回答

3

您在內容值中放置了兩次相同的密鑰。

cv.put(KEY_ARMS, arms); 
    cv.put(KEY_ARMS, date); 

與更改:

cv.put(KEY_ARMS, arms); 
    cv.put(KEY_DATE, date); 
1

你沒有插入沒什麼KEY_DATE,但KEY_DATEnot null。插入

1

非但沒有你KEY_DATE列設置爲「TEXT NOT NULL」,只要將它設置爲純「TEXT」之前

宇必須把cv.put(KEY_DATE, date);。您也可以使用其他任何可能插入空值或空值的列來執行此操作。