2016-06-01 14 views
1

텍스트와 수를 테이블에 저장하는 간단한 프로그램을 만들고 있습니다. 이 데이터는 listView에 표시됩니다. 업데이트 된 데이터를받을 때 문제가 발생했습니다. 그러나 응용 프로그램을 닫고 열 때 데이터가 잘로드됩니다. 내 프로그램을 포함 시켰습니다.데이터베이스에서 데이터를 가져올 수 없습니다.

MainActivity :

public class MainActivity extends AppCompatActivity { 

    private List<Habit> habits; 
    private ListAdapter adapter; 
    private DatabaseHandler handler; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     handler = new DatabaseHandler(getApplicationContext()); 
     habits = handler.getAllHabit(); 
     View empty = getLayoutInflater().inflate(R.layout.list_item_empty, null, false); 
     addContentView(empty, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
     ListView habitList = (ListView) findViewById(R.id.habitList); 
     adapter = new ListAdapter(habits); 
     if (habitList != null) { 
      habitList.setAdapter(adapter); 
      habitList.setEmptyView(empty); 
      habitList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        Habit habit = (Habit) adapter.getItem(position); 
        habit.updateCount(); 
        handler.updateHabit(habit); 
        updateList(); 
       } 
      }); 
      habitList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
       @Override 
       public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
        Habit habit = (Habit) adapter.getItem(position); 
        handler.deleteHabit(habit); 
        updateList(); 
        return true; 
       } 
      }); 
     } 
    } 


    private void getNewHabit() { 

     final AlertDialog.Builder alertDialog = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.Dialog)); 
     alertDialog.setTitle("New Habit"); 
     alertDialog.setMessage("Enter the name of the new habit"); 
     final EditText input = new EditText(getApplicationContext()); 
     int padding = Math.round(getResources().getDimension(R.dimen.margin)); 
     input.setPadding(padding,padding,padding,padding); 
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
     input.setLayoutParams(params); 
     alertDialog.setView(input); 
     alertDialog.setPositiveButton("Add", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       Habit habit = new Habit(); 
       habit.setHabit(input.getText().toString()); 
       habit.setCount(0); 
       handler.addHabit(habit); 
       updateList(); 
      } 
     }); 
     alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.dismiss(); 
      } 
     }); 
     alertDialog.show(); 
    } 

    private void updateList() { 
     habits.clear(); 
     habits = handler.getAllHabit(); 
     adapter.notifyDataSetChanged(); 
    } 
} 

DatabaseHandler :

class DatabaseHandler extends SQLiteOpenHelper { 

    private static final int DATABASE_VERSION = 1; 
    private static final String DATABASE_NAME = "habitDatabase"; 
    private static final String TABLE_NAME = "userHabits"; 
    private static final String KEY_ID = "id"; 
    private static final String KEY_HABIT_NAME = "name"; 
    private static final String KEY_HABIT_COUNT = "count"; 

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

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_HABIT_NAME + " TEXT," + KEY_HABIT_COUNT + " INTEGER)"; 
     db.execSQL(CREATE_TABLE); 
    } 

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

    public void addHabit(Habit habit) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(KEY_HABIT_NAME, habit.getHabit()); 
     values.put(KEY_HABIT_COUNT, habit.getCount()); 
     db.insert(TABLE_NAME, null, values); 
     db.close(); 
    } 

    public int updateHabit(Habit habit) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(KEY_HABIT_NAME, habit.getHabit()); 
     values.put(KEY_HABIT_COUNT, habit.getCount()); 
     return db.update(TABLE_NAME, values, KEY_ID + " = ?", new String[]{String.valueOf(habit.getId())}); 
    } 

    public void deleteHabit(Habit habit) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     db.delete(TABLE_NAME, KEY_ID + " = ?", new String[]{String.valueOf(habit.getId())}); 
     db.close(); 
    } 

    public List<Habit> getAllHabit() { 
     List<Habit> habits = new ArrayList<>(); 
     String SELECT_QUERY = "SELECT * FROM " + TABLE_NAME; 
     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(SELECT_QUERY, null); 
     if (cursor.moveToFirst()) { 
      do { 
       Habit habit = new Habit(); 
       habit.setHabit(cursor.getString(1)); 
       habit.setCount(Integer.parseInt(cursor.getString(2))); 
       habit.setId(Integer.parseInt(cursor.getString(0))); 
       habits.add(habit); 
      } while (cursor.moveToNext()); 
     } 
     cursor.close(); 
     return habits; 
    } 
} 
+1

[mcve] –

+0

에 질문이 포함되어 있는지 확인하십시오. –

+0

AlertDialog를 사용하여 새 항목을 추가 한 후에도 listView에 표시되지 않습니다. 하지만 앱을 닫고 다시 열면 새 항목이 표시됩니다. 내 문제는 MainActivity의 updateList()에 있다고 생각합니다. 그러나 나는 무엇이 잘못 될지 확신하지 못한다. –

답변

0

사용 finishAffinity()이 방법은이 활동을 마무리하고, 같은 친 화성이 현재 작업에 즉시 아래의 모든 활동을 마무리하려고 .

ActivityCompat.finishAffinity(this); 
2

나는 그것을 얻었다. 이것이 올바른 방법인지 아니면 단지 해결 방법인지는 알 수 없습니다. updateList() 방법에서, 나는

바로 지금은에 AlertDialog를 사용하여 항목을 추가 한 직후

habits.addAll(handler.getAllHabit());

목록보기 업데이트에 선

habits = handler.getAllHabit();

을 변경했습니다.

+1

예, 이것은 올바른 방법 Aakaash입니다. 잘 했어.. –

1

SimpleCursorAdapter을 사용하고 데이터베이스에 updation이있을 때마다 어댑터 개체에 changeCursor(newCursor)을 호출하십시오. 인스턴스 변수로

선언 cursorAdpater : 다음

SimpleCursorAdapter cursorAdapter; 

에서 onCreate에서의 cursorAdapter를 초기화하고 목록보기에 그것을 설정 : 데이터베이스의 모든 그 갱신을있을 때마다

Cursor cursor = handler.getAllHabit();//Change the return type of your getAllHabit method to Cursor 
String[] from = new String[]{"name","count"};//database column names 
int[] to = new int[]{R.id.tvName,R.id.tvCount};//TextView id's from custom list row layout 
cursorAdapter = new SimpleCursorAdapter(this,R.layout.list_row,cursor,from,to,CursorAdapter.FLAG_AUTO_REQUERY); 
habitList.setAdapter(cursorAdapter); 

이의를 얻을 수 데이터를 새 커서로 업데이트하고 cursorAdapter에서 changeCursor()으로 호출하고 새 커서를 전달하십시오.

Cursor newCursor = handler.getAllHabit(); 
cursorAdapter.changeCursor(newCursor); 
관련 문제