从sqlite获取数据并显示为listview

时间:2016-01-08 11:33:07

标签: android sqlite

我正在尝试从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);

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

您需要了解数据库的工作方式以及content providers的使用方式。这看起来像你试图逐行转换PHP脚本,除了糟糕的做法是非常低效的。

我可以看到你在这里重新开始,但通常你可以向你展示你尝试解决问题的方法,你无法寻求帮助来调试整个项目,它太宽泛而无法获得有用的答案,因此在撰写下一个问题时请记住这一点。

目前你遇到的问题是对do ... while循环如何工作的误解。

基本上它意味着&#34;做一次,然后继续这样做,只要这另一件事是真的&#34;

所以你的循环遍历第一行,将其添加到列表中,移动到最后一行(跳过中间)。将其添加到列表中。然后一次又一次地转到最后一行,并再次向列表中添加数百个相同的项目。

您需要改变的是:

do {
   ...
} while(cursor.moveToNext());

因为当没有下一行时,moveToNext将返回false。与moveToLast的区别在于它始终返回true ,除非光标为空,它永远不会,因为我们已成功移动到第一项。