2016-08-31 15 views
2

DatabaseTableDayをSQLiteのanthroidアプリケーションに保存したいが、何かが間違っている。SQLite Androidで要素を保存する

DatabaseDAODayは次のとおりです。

public class DatabaseDAODay { 

    public static final String TAG = "DaysDAO"; 

    // Database fields 
    private SQLiteDatabase mDatabase; 
    private DatabaseHelper mDbHelper; 
    private Context mContext; 
    private String[] mAllColumns = { DatabaseHelper.COLUMN_DAY_ID, 
      DatabaseHelper.COLUMN_DAY_NAME, DatabaseHelper.COLUMN_DAY_WEIGHT}; 

    public DatabaseDAODay(Context context) { 
     this.mContext = context; 
     mDbHelper = new DatabaseHelper(context); 
     // open the database 
     try { 
      open(); 
     } catch (SQLException e) { 
      Log.e(TAG, "SQLException on openning database " + e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 

    public void open() throws SQLException { 
     mDatabase = mDbHelper.getWritableDatabase(); 
    } 

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

    public DatabaseTableDay createDay(String name, float weight, Long id) { 
     ContentValues values = new ContentValues(); 
     values.put(DatabaseHelper.COLUMN_DAY_NAME, name); 
     values.put(DatabaseHelper.COLUMN_DAY_WEIGHT, weight); 
     long insertId = id; 
     Cursor cursor = mDatabase.query(DatabaseHelper.TABLE_DAYS, mAllColumns, 
       DatabaseHelper.COLUMN_DAY_ID + " = " + insertId, null, null, 
       null, null); 
     DatabaseTableDay newDay = new DatabaseTableDay(); 
     if(cursor != null && cursor.moveToFirst()){ 
      newDay = cursorToDay(cursor); 
      cursor.close(); 
      Toast.makeText(mContext,"im here",Toast.LENGTH_LONG).show(); 
     } 
     return newDay; 
    } 



    public void deleteDay(DatabaseTableDay databaseTableDay) { 
     long id = databaseTableDay.getId(); 
     // delete all employees of this company 
     DatabaseDAOActivity databaseDAOActivity = new DatabaseDAOActivity(mContext); 
     List<DatabaseTableActivity> databaseTableActivities = databaseDAOActivity.getActivitiesOfDay(id); 
     if (databaseTableActivities != null && !databaseTableActivities.isEmpty()) { 
      for (DatabaseTableActivity e : databaseTableActivities) { 
       databaseDAOActivity.deleteActivity(e); 
      } 
     } 

     System.out.println("the deleted day has the id: " + id); 
     mDatabase.delete(DatabaseHelper.TABLE_DAYS, DatabaseHelper.COLUMN_DAY_ID 
       + " = " + id, null); 
    } 


    public List<DatabaseTableDay> getAllDays() { 
     List<DatabaseTableDay> listDays = new ArrayList<DatabaseTableDay>(); 

     Cursor cursor = mDatabase.query(DatabaseHelper.TABLE_DAYS, mAllColumns, 
       null, null, null, null, null); 
     if (cursor != null) { 
      cursor.moveToFirst(); 
      while (!cursor.isAfterLast()) { 
       DatabaseTableDay day = cursorToDay(cursor); 
       listDays.add(day); 
       cursor.moveToNext(); 
      } 
      // make sure to close the cursor 
      cursor.close(); 
     } 
     return listDays; 
    } 


    public DatabaseTableDay getDayById(long id) { 
     Cursor cursor = mDatabase.query(DatabaseHelper.TABLE_DAYS, mAllColumns, 
       DatabaseHelper.COLUMN_DAY_ID + " = ?", 
       new String[] { String.valueOf(id) }, null, null, null); 
     if (cursor != null) { 
      cursor.moveToFirst(); 
     } 

     DatabaseTableDay databaseTableDay = cursorToDay(cursor); 
     return databaseTableDay; 
    } 

    protected DatabaseTableDay cursorToDay(Cursor cursor) { 
     DatabaseTableDay databaseTableDay = new DatabaseTableDay(); 
     databaseTableDay.setId(cursor.getLong(0)); 
     databaseTableDay.setName(cursor.getString(1)); 
     databaseTableDay.setWeight(cursor.getLong(2)); 
     return databaseTableDay; 
    } 


} 

と私はでそれを保存しよう:

saveButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     DatabaseTableDay databaseTableDay = databaseDAODay.createDay(
       editText.getText().toString(), 100f, new Long(myId)); 

     List<DatabaseTableDay> list = databaseDAODay.getAllDays(); 
    } 
}); 

しかしlistはとにかく空です。

おそらく問題はcreateDay()メソッドで、DatabaseDAODayです。条件が常にnullで、アプリケーションが実行していない場合は、cursorToDay()メソッドです。

私は問題がありませんでした。cursot.moveToFirst()とそれに続いてcursorToDay()があったのは、coursorがnullだったのでNullPoinerExceptionでした。私はthisに続き、条件は!=nullですが、実際には何も起こりません。リストは常に空です。

問題をどのように解決すればよいですか?

public DatabaseTableDay createDay(String name, float weight, Long id) { 

    DatabaseTableDay dayToReturn; 
    ContentValues values = new ContentValues(); 
    values.put(DatabaseHelper.COLUMN_DAY_NAME, name); 
    values.put(DatabaseHelper.COLUMN_DAY_WEIGHT, weight); 
    values.put(DatabaseHelper.COLUMN_DAY_ID, id); 

    long resID = mDatabase.insert(DatabaseHelper.TABLE_DAYS, null, values); 
    if (resID == -1) 
    { 
     // something went wrong, do error handling here 
     dayToReturn = null; 
    } 
    else 
    { 
     // no error: resID is "the row ID of the newly inserted row" 
     // you only need this info if you are using autoincrement 
     // not if you set the ID yourself 

     // all right, this will work - 
     // but somehow it hurts a little to retrieve an entry I just added. 
     // I'd like much more to simply use a constructor with all the values 
     // and create a new DatabaseTableDay instance 
     dayToReturn = getDayById(id); 
    }  

    return dayToReturn; 
} 

参照を:あなたはこのようなあなたの方法を変更し

query()

を使用して、データベースから読み取ろうと代わりの insert()を使用して、新しい一日を挿入:

答えて

0

あなたは問題がcreateDay()のことについて正しいですSQLiteDatabase insert()のこのリンクも

+0

完璧に動作します!しかし、もう一つ質問があります。ウェブからデータをダウンロードしてSQLiteに入れたいと思っています。複数のテーブルを実装せず、すべてをJson値で 'DatabaseTableDay'テーブルに格納するのは非常に難しい解決法ですか?私は、オブジェクトの代わりにオブジェクトからJsonとStringを持っていることを意味します。 – barmi

+0

@barmi非常に残念ですが、私はJSONで多くの経験がありません。だから、たぶんあなたは片方の時間/コード/仕事を節約して(データを挿入する)、他の部分でより多くの情報を得ることができます。私はあなたが小さな例(多分CodeReviewでも)で新しい質問をするべきだと思います答えは、どのような情報をデータベースから取得するかによって大きく異なります。 – 0X0nosugar

関連する問題