나는 동적으로 추가 된 항목이 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으로 시작하고 목록이 다른 순서로 시작됩니다. 더 많은 연구를 할 것입니다
:
그래서 우리는 (
order by _id desc
)에 코드를 변경해야합니까? 또한, 당신과 관련된 설명 : 제거 된 고양이가 목록에 다시 나타 납니까? 개나 말은 여전히 데이터베이스에 있습니까? 설명 된 시나리오에서 각 작업을 디버그하고 데이터베이스가 적절한 상태인지 확인해야합니다. – Luksprog@Luksprog'List
@Luksprog b)가 문제였던 것 같아요. 재현하는 것은 꽤 복잡하지만 removeItem() 메서드는 잘못된 항목을 제거합니다. 단계에 질문을 추가 할 것입니다. – RiThBo