2013-08-10 14 views
0

나는 동적으로 추가 된 항목이 ListView입니다. 항목이 추가되면 목록에있는 항목을 저장할 수 있도록 ListView에 추가되고 SQLite 데이터베이스에 삽입됩니다. 항목이있는 경우 항목을 가져 와서 해당 항목으로 제거하여 특정 항목을 제거 할 수도 있습니다. History을 .class에서제거 및 ListView 및 데이터베이스의 항목 복원

public void addItem(Object data) { 

     String string = String.valueOf(data); 

     mPlanetsList.add(createPlanet("planet", string)); 
     History history = new History(); 
     history.getDataHashMap().put("planet", data); 
     history.addToHistoryDB(); 

     mHistoryList.add(history); 

     if (null != mOnItemAddHandler) { 
      mOnItemAddHandler.onItemAdded(data); 
     } 
    } 

:

DataModel.class에서 :

내가 항목 (I 여러 클래스를 사용)를 추가 어떻게

public void addToHistoryDB() { 

     MySQLiteOpenHelper mDbHelper = MySQLiteOpenHelper.getInstance(); 
     SQLiteDatabase db = mDbHelper.getWritableDatabase(); 

     ContentValues values = getContentValues(); 

     rawId = (int) db.insert(TABLE_NAME, COL_ID, values); 
     db.close(); 
    } 

이 어떻게 입니다 항목을 삭제하십시오 :

DataModel에서의 .class :

public void removeItem(int index) { 

     if (mPlanetsList == null || index < 0 || index >= mPlanetsList.size()) { 
      return; 
     } 
     // remove from mPlanetList 
     mPlanetsList.remove(index); 

     History history = mHistoryList.get(index); 
     mHistoryList.remove(index); 
     if (null != history) { 
      history.remove(); 
      history = null; 
     } 

     // notify, the HistoryFragment will update view 
     if (null != mOnItemAddHandler) { 
      mOnItemAddHandler.onItemRemove(index); 
     } 

History에서의 .class :

'최근 애플 리케이션'제거하거나 재시작 할 때의 앱 initList()리스트 뷰 항목을 복원하는라고
public void remove() { 
     MySQLiteOpenHelper mDbHelper = MySQLiteOpenHelper.getInstance(); 
     SQLiteDatabase db = mDbHelper.getWritableDatabase(); 

     int r = db.delete(TABLE_NAME, "_id = ?", // delete the int r ?? 
       new String[] { String.valueOf(rawId) }); 
     db.close(); 
    } 

데이터베이스에서.

DataModel :

private void initList() { 



     mHistoryList = History.getList(); 
     for (int i = 0; i < mHistoryList.size(); i++) { 
      Object obj = mHistoryList.get(i).getDataHashMap().get("planet"); 
      mPlanetsList.add(createPlanet("planet", String.valueOf(obj))); 
     } 
    } 

History :

코드입니다

public static ArrayList<History> getList() { 
     Cursor cursor = null; 
     try { 
      MySQLiteOpenHelper mDbHelper = MySQLiteOpenHelper.getInstance(); 
      SQLiteDatabase db = mDbHelper.getWritableDatabase(); 
      String sql = "select * from " + History.TABLE_NAME; 
      ArrayList<History> list = new ArrayList<History>(); 
      cursor = db.rawQuery(sql, null); 
      if (cursor != null) { 
       for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor 
         .moveToNext()) { 
        History item = new History(); 
        item.fromCuror(cursor); 
        list.add(item); 
       } 
      } 
      return list; 
     } finally { 
      if (null != cursor && Integer.parseInt(Build.VERSION.SDK) < 14) { 
       cursor.close(); 
      } 
     } 
    } 

이 방법은 한 목록의 순서가 변경되지 않는 잘 작동 - 내가 추가 할 수 있습니다 항목을 제거하고 항목을 모두 완벽하게 작동합니다. 그러나 항목을 맨 아래가 아닌 맨 위에 추가하고 싶습니다.

그래서 ListView의 상단에 항목을 추가하는 방법을 살펴본 후 항목을 추가 할 때 위치를 0으로 추가하면 새 항목이 목록의 맨 위로 이동합니다.

mPlanetsList.add(0, createPlanet("planet", string)); // I put the 0 in wherever the item is added eg when adding from the database 

그러나 이렇게하면 ListView에서 보거나 삭제 한 항목이 데이터베이스의 데이터와 계속 일치하지 않습니다. 예를 들어 목록에 세 개의 항목을 추가한다고 가정하면 dog, cat, horse입니다. ListView는 올바른 순서 (상단에 horse)로 표시합니다. 항목을 삭제하면 다음과 같이 말합니다. cat, ListView 업데이트 및 모든 것이 좋습니다. 하지만 앱을 다시 시작하면 initList()이 호출됩니다. 문제가 발생한 곳입니다. 목록에서 제거 된 이 아니고cat 인 경우 horse 또는 dog입니다.나는이 문제가 될 수 있다고 생각

가능한 점 :

가) initList (투입) - removeItem()에서 올바른 항목

B)를 추가하지 않습니다 - 그것은이 제거되지 않습니다 데이터베이스에서 항목을 수정하십시오.

c) getList() - 커서가있는 무언가 ???

이렇게 생각하면 b)가 더 나을지 모르지만 문제가 정확히 어디서 무엇인지, 또는 무엇을 변경해야할지 모르겠습니다. 편집

: 잘못 어디로가는 약간의 테스트 후

, 나는 내가 바로 그 B 것을 발견했다)입니다.

단계는 재현 : cat 다음 dog 다음 horse :

이 세 가지 항목을 만듭니다. ListView은 올바른 순서대로 표시합니다. 즉, 상단에 horse, 하단에는 cat입니다. Database은 상단에 , 하단에는 horse으로 표시됩니다.

나는 ListView 업데이트 제대로 horse (ListView 위에, Database의 하단)을 삭제

,하지만 데이터베이스에서 삭제 된 horse 있지만, 사실은 cat에 있지 않습니다.

따라서 잘못된 제거 때문에 Database을 사용하여 ListView을 복원하면 ListView가 잘못 표시됩니다.

이 점이 더 명확 해지기를 바랍니다.

편집 2 :

public static final String TABLE_NAME = "history_table"; 
    public static final String COL_TITLE = "title"; 
    public static final String COL_CONTENT = "content"; 
    public static final String COL_DATE = "date"; 
    public static final String COL_TYPE = "type"; 
    public static final String COL_ONGOING = "ongoing"; 
    public static final String COL_DATA = "data"; 
    public static final String COL_ID = "_id"; 

    public static final String DATABASE_CREATE = "create table " + TABLE_NAME 
      + "(" + COL_ID + " integer primary key autoincrement, " + COL_TITLE 
      + " text not null, " + COL_CONTENT + " text not null, " + COL_DATE 
      + " text not null, " + COL_TYPE + " text not null, " + COL_ONGOING 
      + " text not null, " + COL_DATA + " text not null );"; 

이 getContentValues ​​()이다 :

public ContentValues getContentValues() { 

     ContentValues values = new ContentValues(); 
     values.put(History.COL_TITLE, "MyTitle"); 
     values.put(History.COL_CONTENT, "MyContent"); 
     values.put(History.COL_DATE, "Date placeholder"); 
     values.put(History.COL_TYPE, "QuickNote"); 
     values.put(History.COL_ONGOING, "Ongoing placeholder"); 
     values.put(History.COL_DATA, new JSONObject(mDataHashMap).toString()); 

     return values; 
    } 

편집 3 :

나는 기본적으로 좁혀 이것은 내 테이블을 생성하는 방법이다 ListView와 데이터베이스의 항목 순서가 다르기 때문에 del 그 목록에서 그들의 포스트 작업에 의한 에팅 아이템이 작동하지 않습니다. 그래서 가능한 해결책은 ListView와 일치하도록 데이터베이스의 항목 순서를 뒤집는 것입니다 (좋은 아이디어/가능?).

편집 3.1 : 내림차순으로

https://stackoverflow.com/a/7348117/2442638

이 순서는 도움이 될 수 있습니다. 지금 주문 작업이

: 나는 그것을 3.5 EDIT

하지만 넣어해야하는 위치 모르겠어요.삭제 작업은 거의 완료되었지만 첫 번째 삭제가 작동하지 않는 문제가 있습니다. 그 후에 나머지는 작동합니다. _id으로 정렬 중이며 autoincrement 일 수 있습니다. 아마 1 또는 0으로 시작하고 목록이 다른 순서로 시작됩니다. 더 많은 연구를 할 것입니다

+0

:

그래서 우리는 (order by _id desc)에 코드를 변경해야합니까? 또한, 당신과 관련된 설명 : 제거 된 고양이가 목록에 다시 나타 납니까? 개나 말은 여전히 ​​데이터베이스에 있습니까? 설명 된 시나리오에서 각 작업을 디버그하고 데이터베이스가 적절한 상태인지 확인해야합니다. – Luksprog

+0

@Luksprog'List > planetsList' ListView에 제공 할 때 내 목록입니다. 어댑터는''SimpleAdapter' SimpleAdapter simpleAdpt = 새로운 SimpleAdapter (getActivity() planetsList, \t \t \t \t android.R.layout.simple_list_item_1, 새로운 String [] { "행성"}, \t \t \t \t 새로운 int [] {android.R.id.text1});'다른 단계에서 데이터베이스의 상태를 찾아 보겠습니다. – RiThBo

+0

@Luksprog b)가 문제였던 것 같아요. 재현하는 것은 꽤 복잡하지만 removeItem() 메서드는 잘못된 항목을 제거합니다. 단계에 질문을 추가 할 것입니다. – RiThBo

답변

0

앱에 두 개의 목록이 있습니다 : mHistoryListmPlanetsList, 데이터의 순서는 동일하게 유지해야합니다.

당신은 DataModel이있는 방법 addItem를 호출하여 listview의 상단에 항목을 추가 할 수 있습니다 :

public void addItem(Object data) { 

    History history = new History(); 
    history.getDataHashMap().put("planet", data); 
    history.addToHistoryDB(); 

    mHistoryList.add(0, history); 
    mPlanetsList.add(0, history.createPlanet()); 

    if (null != mOnItemAddHandler) { 
     mOnItemAddHandler.onItemAdded(data); 
    } 
} 

그런 다음 새로운 데이터가 listview의 상단에있을 것입니다.

는 응용 프로그램이 다시 시작되면, 아래의 코드가 호출됩니다

private void initList() { 

    mHistoryList = History.getList(); 
    for (int i = 0; i < mHistoryList.size(); i++) { 
     mPlanetsList.add(mHistoryList.get(i).createPlanet()); 
    } 
} 

우리는 확인 History.getList();의 데이터가 다른 단어, 같은 순서를 가지고해야한다,리스트의 머리에 새 데이터 시간. 사용중인 어댑터의 유형

public static ArrayList<History> getList() { 
    Cursor cursor = null; 
    try { 
     MySQLiteOpenHelper mDbHelper = MySQLiteOpenHelper.getInstance(); 
     SQLiteDatabase db = mDbHelper.getWritableDatabase(); 

     // order by _id desc 
     String sql = "select * from " + History.TABLE_NAME + " order by _id desc"; 
     ArrayList<History> list = new ArrayList<History>(); 
     cursor = db.rawQuery(sql, null); 
     if (cursor != null) { 
      for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { 
       History item = new History(); 
       item.fromCuror(cursor); 
       list.add(item); 
      } 
     } 
     return list; 
    } finally { 
     if (null != cursor && Integer.parseInt(Build.VERSION.SDK) < 14) { 
      cursor.close(); 
     } 
    } 
} 
+0

해답을 주셔서 고마워요. 나는 이것을 이전에 시도했지만 여전히 문제가있다. (제 edit 3.5를 보아라.) 내 코드가 너의 것과 비슷하게 보이도록 다시 시도 할 것이다. – RiThBo

+0

나에게 보낸 코드가 사용했던 코드인가? 내림차순으로 목록을 가져 오지 않았 음을 알았습니다. 최신 버전이 아닌 경우 최신 코드를 붙여 넣으시겠습니까? 그건 그렇고, 내가 보낸 프로젝트를 만들었 니? 그게 네가 기대하는대로 행동 한거야? – srain

+0

나는 Luksprog가 당신을 보내준 코드에서 주문을 삭제했다고 말했습니다. 곧 내 버전을 붙여넣고 시도해 보겠습니다. 아직 시간이 없습니다. – RiThBo

관련 문제