我正在尝试从sq lite数据库中获取数据并显示为列表。 我之前尝试过不同的解决方案,但没有运气。
当我尝试显示列表时,我不断获得 GC-CONCURRENT FREED 。 一段时间后,我出现内存不足错误,应用程序停止响应。
DataBaseHelper.class
public class DataBaseHandler extends SQLiteOpenHelper {
private static final int Database_Version = 1;
private static final String Database_Name = "remindme";
static final String Table_RemindMe = "reminders";
static final String Key_Id = "id";
static final String Key_Title = "title";
static final String Key_Description = "description";
static final String Key_Date = "date";
List<RemindMe> reminderList = new ArrayList<RemindMe>();
public DataBaseHandler(Context context) {
super(context, Database_Name, null, Database_Version);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String CREATE_REMINDME_TABLE = "CREATE TABLE " + Table_RemindMe + "("
+ Key_Id + " INTEGER PRIMARY KEY AUTOINCREMENT," + Key_Title
+ " TEXT, " + Key_Date + " TEXT," + Key_Description + " TEXT" + ")";
db.execSQL(CREATE_REMINDME_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXIXTS" + Table_RemindMe);
onCreate(db);
}
void addRemindMe(RemindMe remindme){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(Key_Title, remindme.getTitle());
values.put(Key_Description, remindme.getDescription());
values.put(Key_Date, remindme.getDate());
db.insert(Table_RemindMe, null, values);
db.close();
}
public List<RemindMe> getReminder(){
List<RemindMe> reminderList = new ArrayList<RemindMe>();
String selectQuery = "Select * FROM " + Table_RemindMe ;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
try{
if(cursor.moveToFirst()){
do{
RemindMe reminder = new RemindMe();
reminder.setId(Integer.parseInt(cursor.getString(0)));
reminder.setTitle(cursor.getString(1));
reminder.setDescription(cursor.getString(2));
reminder.setDate(cursor.getString(3));
reminderList.add(reminder);
}while(cursor.moveToLast());
}
}
finally{
cursor.close();
}
db.close();
return reminderList;
}
列出类
DataBaseHandler db=new DataBaseHandler();
Log.d("Reading", "Reading Reminders");
List<RemindMe> reminders= db.getReminder();
for(RemindMe r:reminders){
HashMap<String, String> map = new HashMap<String, String>();
map.put("Title", r.title);
map.put("Desc", r.description);
Items.add(map);
}
ListAdapter adapter=new SimpleAdapter(this,Items,android.R.layout.simple_expandable_list_item_1,new String[]{"Iitle" , "Desc"},null);
lv.setAdapter(adapter);
请帮我解决这个问题。
答案 0 :(得分:1)
您需要了解数据库的工作方式以及content providers的使用方式。这看起来像你试图逐行转换PHP脚本,除了糟糕的做法是非常低效的。
我可以看到你在这里重新开始,但通常你可以向你展示你尝试解决问题的方法,你无法寻求帮助来调试整个项目,它太宽泛而无法获得有用的答案,因此在撰写下一个问题时请记住这一点。
目前你遇到的问题是对do ... while循环如何工作的误解。
基本上它意味着&#34;做一次,然后继续这样做,只要这另一件事是真的&#34;
所以你的循环遍历第一行,将其添加到列表中,移动到最后一行(跳过中间)。将其添加到列表中。然后一次又一次地转到最后一行,并再次向列表中添加数百个相同的项目。
您需要改变的是:
do {
...
} while(cursor.moveToNext());
因为当没有下一行时,moveToNext将返回false。与moveToLast的区别在于它始终返回true ,除非光标为空,它永远不会,因为我们已成功移动到第一项。