2016-08-31 2 views
2

Я хочу сэкономить DatabaseTableDay моему SQLite в аппликаторе anndroid, но что-то не так.Сохранение элементов в 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() было NullPoinerException - потому что coursor был null. Я следовал this и ставил условие !=null, но на самом деле ничего не происходит, и список всегда пуст ...

Как я могу решить свою проблему?

ответ

0

Вы правы проблема будучи createDay(): вместо того, чтобы вставить новый день с помощью insert() вы пытаетесь прочитать из базы данных с помощью query()

Измените метод так:

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

Посмотреть также эта ссылка на документацию для SQLiteDatabase insert()

+0

Это прекрасно работает! Тем не менее, у меня есть еще один вопрос: я загружаю некоторые данные из сети и хочу поместить их в SQLite. Это очень плохое решение не реализовать несколько таблиц и поместить все в одну таблицу «DatabaseTableDay» с Json значением? Я имею в виду, что у меня есть String с Json из 'object' вместо List od' object' – barmi

+0

@barmi Мне очень жаль, но у меня нет такого большого опыта работы с JSON. Сказав это, возможно, вы сэкономите время/код/​​работу на одном конце (вставляете данные) только для того, чтобы больше узнать об этом (получение информации). Я думаю, вы должны задать новый вопрос с небольшим примером (возможно, также и на CodeReview), потому что речь идет о том, какой дизайн лучше и почему. Ответ будет зависеть от того, какую информацию вы хотите получить из базы данных. – 0X0nosugar

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