Android SQLite 数据库泄露错误

标签 android sqlite

我在使用 SQLite 时遇到问题,我不知道该如何解决

我不知道这个错误是否会导致 OutOfMemoryError 因为我也有这个错误所以请帮助我解决这个错误

A SQLiteConnection object for database ......... was leaked!

My database code

public class DB_Sqlit extends SQLiteOpenHelper {

public static final String BDname = "mdata.db";

public DB_Sqlit(Context context) {
    super(context, BDname, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table favorite ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, img TEXT, url TEXT, num TEXT, size TEXT)");
     }

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

}



public Boolean Insert_to_favorite(String name, String img, String url, String num, String size) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put("name", name);
    contentValues.put("img", img);
    contentValues.put("url", url);
    contentValues.put("num", num);
    contentValues.put("size", size);


    long result = db.insert("favorite", null, contentValues);

    if (result == -1)
        return false;
    else
        return true;

}


public List getAllList_Favorite() {
    List<listitem_gib> list = new ArrayList<listitem_gib>();
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor rs = db.rawQuery("select * from favorite", null);

    if (rs.moveToFirst()){
        do {
            listitem_gib model = new listitem_gib();
            model.setId(rs.getString(0));
            model.setName(rs.getString(1));
            model.seturl(rs.getString(3));
            model.setimg(rs.getString(2));
            model.setnum(rs.getString(4));
            model.setsize(rs.getString(5));

            list.add(model);
        }while (rs.moveToNext());
    }
    Log.d("rewayat data", list.toString());
    return list;
}


public int get_check_List_Favorite(String Title) {

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor rs = db.rawQuery("select * from favorite Where name like '"+ Title +"'", null);
    rs.moveToFirst();
    Cursor cursor = null;
    try {
        int count = rs.getCount();
        return count;
        // do some work with the cursor here.
    } finally {
        // this gets called even if there is an exception somewhere above
        if(cursor != null)
            cursor.close();
    }

}


public Integer DeleteFav(String id) {
    SQLiteDatabase db = this.getWritableDatabase();
    return db.delete("favorite", "id = ?", new String[]{id});
}}}

请问我该如何解决这个错误?

我怀疑这个错误会导致 OutOfMemoryError 吗?

database edit

public class DB_Sqlit extends SQLiteOpenHelper {

public static final String BDname = "mdata.db";

public DB_Sqlit(Context context) {
    super(context, BDname, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table favorite ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, img TEXT, url TEXT, num TEXT, size TEXT)");
    db.execSQL("create table download ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, img TEXT, url TEXT, num TEXT, size TEXT)");

}

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

}



public Boolean Insert_to_favorite(String name, String img, String url, String num, String size) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put("name", name);
    contentValues.put("img", img);
    contentValues.put("url", url);
    contentValues.put("num", num);
    contentValues.put("size", size);


    long result = db.insert("favorite", null, contentValues);
    db.close();

    if (result == -1)
        return false;
    else
        return true;

}


public List getAllList_Favorite() {
    List<listitem_gib> list = new ArrayList<listitem_gib>();
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor rs = db.rawQuery("select * from favorite", null);

    if (rs.moveToFirst()){
        do {
            listitem_gib model = new listitem_gib();
            model.setId(rs.getString(0));
            model.setName(rs.getString(1));
            model.seturl(rs.getString(3));
            model.setimg(rs.getString(2));
            model.setnum(rs.getString(4));
            model.setsize(rs.getString(5));

            list.add(model);
        }while (rs.moveToNext());
    }
    Log.d("rewayat data", list.toString());
    rs.close();
    db.close();
    return list;
}


public int get_check_List_Favorite(String Title) {

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor rs = db.rawQuery("select * from favorite Where name like '"+ Title +"'", null);
    rs.moveToFirst();
    Cursor cursor = null;
    try {
        int count = rs.getCount();
        return count;
        // do some work with the cursor here.
    } finally {
        // this gets called even if there is an exception somewhere above
        if(cursor != null){
            rs.close();
            db.close();
        }
    }

}


public Integer DeleteFav(String id) {
    SQLiteDatabase db = this.getWritableDatabase();
    return db.delete("favorite", "id = ?", new String[]{id});
}






public Boolean Insert_to_download(String name, String img, String url, String num, String size) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put("name", name);
    contentValues.put("img", img);
    contentValues.put("url", url);
    contentValues.put("num", num);
    contentValues.put("size", size);


    long result = db.insert("download", null, contentValues);
    db.close();

    if (result == -1)
        return false;
    else
        return true;

}


public List getAllList_download() {
    List<listitem_gib> list = new ArrayList<listitem_gib>();
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor rs = db.rawQuery("select * from download", null);

    if (rs.moveToFirst()){
        do {
            listitem_gib model = new listitem_gib();
            model.setId(rs.getString(0));
            model.setName(rs.getString(1));
            model.seturl(rs.getString(3));
            model.setimg(rs.getString(2));
            model.setnum(rs.getString(4));
            model.setsize(rs.getString(5));

            list.add(model);
        }while (rs.moveToNext());
    }
    Log.d("rewayat data", list.toString());
    rs.close();
    db.close();
    return list;
}


public int get_check_List_download(String Title) {

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor rs = db.rawQuery("select * from download Where name like '"+ Title +"'", null);
    rs.moveToFirst();
    Cursor cursor = null;
    try {
        int count = rs.getCount();
        return count;
        // do some work with the cursor here.
    } finally {
        // this gets called even if there is an exception somewhere above
        if(cursor != null) {
            rs.close();
            db.close();
        }
    }
}


public Integer Deletedown(String id) {
    SQLiteDatabase db = this.getWritableDatabase();
    return db.delete("download", "id = ?", new String[]{id});
}}

最佳答案

OutOfMemoryError ? ,记住你必须关闭所有的游标:

public List getAllList_Favorite() {
    List<listitem_gib> list = new ArrayList<listitem_gib>();
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor rs = db.rawQuery("select * from favorite", null);

    if (rs.moveToFirst()){
        do {
            listitem_gib model = new listitem_gib();
            model.setId(rs.getString(0));
            model.setName(rs.getString(1));
            model.seturl(rs.getString(3));
            model.setimg(rs.getString(2));
            model.setnum(rs.getString(4));
            model.setsize(rs.getString(5));

            list.add(model);
        }while (rs.moveToNext());
    }
    Log.d("rewayat data", list.toString());

    cursor.close();  //*** Add this line!

    return list;
}

如果您收到此消息:

Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.

请务必关闭应用程序中的所有光标。

关于Android SQLite 数据库泄露错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40921031/

相关文章:

python-3.x - Flask sqlite3 INSERT失败,没有错误信息?

c# - system.data.sqlite 的内存数据库包装器

android - 防止模拟的 GPS 位置恢复为真实值

java - Android 帐户管理器在设置中删除选项菜单

android - 从 RecyclerView 完整内容创建 PDF?

android - 授权 Google Drive Android API

python - 在带有 sqlite 的 Python 中是否有必要关闭游标?

python - 从 io.BytesIO 流打开 sqlite3 数据库?

C - SQLite 绑定(bind)不工作

android - 在 Activity 上调用 onPause 时数据会发生什么