Android的sqlite的日志报告和db.close() [英] Android sqlite log reports and db.close()

查看:123
本文介绍了Android的sqlite的日志报告和db.close()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

日志报告数据库或游标没有关闭。我基本上有一个自定义的surfaceview的活动,并使用一个处理器报到活动。当我收到味精我表现出alertdialog还更新数据库。

 专用处理器处理器=新的处理程序(){
    公共无效的handleMessage(消息MSG){
        开关(msg.what){
        情况1:
            dh.open();
            dh.updateEvent(ID,姓名,人);
            dh.close();
            successAlert.show();
            打破;
        案例2:
            failAlert.show();
            打破;
        }
    }
};

previously我根本没有dh.close()和多数民众赞成在日志中报告数据库/光标没有关闭。但自从我补充说,它需要一个很长的时间才能完成。一旦我得到的消息,该系统似乎挂起。难道我做错了什么或它通常利用这个长。我已经使用try块以最终关闭该数据库还尝试。

编辑:

 公共类DatabaseHelper {私有数据库dbHelper;
私人SQLiteDatabase分贝;
私人上下文的背景下;公共DatabaseHelper(上下文的背景下){
    this.context =背景;
    //数据库=新的数据库(背景);
}公共无效的open(){
    dbHelper =新的数据库(背景);
    DB = dbHelper.getWritableDatabase();
}公共无效的close(){
    dbHelper.close();
}公共无效updateEvent(INT ID,字符串名称,诠释等){
    ContentValues​​ CV =新ContentValues​​();
    cv.put(ID,身份证);
    cv.put(名,名);
    cv.put(其他,等);
    db.update(stateTable,品种,ID =+编号,零);
}公共布尔checkState(INT ID){
    DB = dbHelper.getReadableDatabase();
    光标光标= db.query(stateTable,NULL,NULL,NULL,NULL,NULL,NULL);
    cursor.moveToPosition(ID - 1);
    INT I = cursor.getInt(2);
    android.util.Log.d(semajhan,:+ I);
    如果(ⅰ== 1){
        返回true;
    }其他{
        返回false;
    }
}

}

扩展SQLiteOpenHelper:

 公共类数据库扩展SQLiteOpenHelper {私有静态最后弦乐DATABASE_NAME =events.db;
私有静态最终诠释DATABASE_VERSION = 1;
私有静态最后弦乐TABLE_NAME =stateTable;
私有静态最后弦乐ID =ID;
私有静态最后弦乐NAME =名;
私有静态最后弦乐其他=其他;
私有静态最后弦乐DATABASE_CREATE =CREATE TABLE stateTable(ID INT,Name文本,其他INT);
私有静态最后弦乐DATABASE_UPGRADE =DROP TABLE IF EXISTS表;公共数据库(上下文的背景下){
    超(背景下,DATABASE_NAME,空,DATABASE_VERSION);
    // TODO自动生成构造函数存根
}@覆盖
公共无效的onCreate(SQLiteDatabase DB){
    // TODO自动生成方法存根
    db.execSQL(DATABASE_CREATE);
    //添加初始值
}@覆盖
公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
    // TODO自动生成方法存根
    db.execSQL(DATABASE_UPGRADE);
    的onCreate(DB);
}

}

  13 01-11:57:41.239:ERROR / ActivityManager(61):ANR在com.semajhan.soodles(com.semajhan.soodles / .Level1)
01-11 13:57:41.239:ERROR / ActivityManager(61):原因:keyDispatchingTimedOut
01-11 13:57:41.239:ERROR / ActivityManager(61):负载:1.64 / 0.56 / 0.26
01-11 13:57:41.239:ERROR / ActivityManager(61):从35716ms CPU使用率前-1ms:
01-11 13:57:41.239:ERROR / ActivityManager(61):44%,862 / com.semajhan.soodles:37%用户+ 7.2%,核心/故障:853轻微
01-11 13:57:41.239:ERROR / ActivityManager(61):29%,61 / system_server:27%用户+ 1.9%,核心/故障:142轻微
01-11 13:57:41.239:ERROR / ActivityManager(61):0.2%731 / com.android.quicksearchbox:0%用户+ 0.2%,核心/故障:30轻微
01-11 13:57:41.239:ERROR / ActivityManager(61):0.2%707 / com.android.launcher:0.2%的用户+ 0%,核心/故障:30轻微
01-11 13:57:41.239:ERROR / ActivityManager(61):0.2%801 / com.svox.pico:0.1%的用户+ 0.1%,核心/故障:363轻微
01-11 13:57:41.239:错误/ ActivityManager(61):0%117 / com.android.systemui:0%使用者+ 0%的内核
01-11 13:57:41.239:错误/ ActivityManager(61):0%41 / adbd:0%使用者+ 0%的内核
01-11 13:57:41.239:ERROR / ActivityManager(61):99%合计86%的用户13%的内核+ 0%IRQ
01-11 13:57:41.239:ERROR / ActivityManager(61):从1969ms CPU使用率后2620ms:
01-11 13:57:41.239:ERROR / ActivityManager(61):54%,61 / system_server:48%用户+ 6%的内核
01-11 13:57:41.239:ERROR / ActivityManager(61):40%69 / SurfaceFlinger的:40%的用户+ 0%内核
01-11 13:57:41.239:ERROR / ActivityManager(61):10%92 / InputDispatcher:7.5%的用户+ 3%的内核
01-11 13:57:41.239:ERROR / ActivityManager(61):1.5%,62 / HeapWorker:1.5%的用户+ 0%内核
01-11 13:57:41.239:ERROR / ActivityManager(61):44%,862 / com.semajhan.soodles:32%的用户12%的内核/故障:2人轻伤
01-11 13:57:41.239:ERROR / ActivityManager(61):24%,874 /线程13:24%的用户+ 0%内核
01-11 13:57:41.239:ERROR / ActivityManager(61):23%,862 / studios.soodles:4.6%的用户18%的内核
01-11 13:57:41.239:ERROR / ActivityManager(61):1.5%867 /编译:0%用户+ 1.5%的内核
01-11 13:57:41.239:ERROR / ActivityManager(61):0.8%,731 / com.android.quicksearchbox:0%用户+ 0.8%的内核
01-11 13:57:41.239:ERROR / ActivityManager(61):0.8%,732 / HeapWorker:0%用户+ 0.8%的内核
01-11 13:57:41.239:ERROR / ActivityManager(61):100%总计:76%的用户23%的内核


解决方案

第一次调用 getReadableDatabase getWritableDatabase SQLiteOpenHelper 实例需要的真正的很长一段时间才能完成。你不应该创建一个新的数据库对象(你的 SQLiteOpenHelper 实例),每一个需要查询数据库的时间。尝试使用在 DatabaseHelper 相同数据库实例。

在使用 SQLiteOpenHelper ,你不希望关闭 SQLiteDatabase 对象的 SQLiteOpenHelper ,因为它是共享的;即 getWritableDatabase 总是返回相同的 SQLiteDatabase 对象。

注意,你的 checkState 方法泄漏光标。为了帮助prevent光标泄漏,我总是用尝试 - 最后获得光标之后。例如:

  DB = dbHelper.getReadableDatabase();
    光标光标= db.query(stateTable,NULL,NULL,NULL,NULL,NULL,NULL);
    尝试{
        cursor.moveToPosition(ID - 1);
        INT I = cursor.getInt(2);
        android.util.Log.d(semajhan,:+ I);
        如果(ⅰ== 1){
                返回true;
        }其他{
                返回false;
        }
    } {最后
        cursor.close();
    }

The log reports that the database or cursor was not closed. I basically have an activity with a custom surfaceview and uses a handler to report back to the activity. When I receive the msg I show an alertdialog and also update the database.

private Handler handler = new Handler() {
    public void handleMessage(Message msg) {
        switch(msg.what) {
        case 1:
            dh.open();
            dh.updateEvent("id", "name", "someone");
            dh.close();
            successAlert.show();
            break;
        case 2:
            failAlert.show();
            break;
        }
    }
};

Previously I did not have "dh.close()" and thats when the log reported database/cursor not closed. But ever since I added that in, it takes a really long time to complete. Once I get the message, the system seems to hang. Am I doing something wrong or does it usually take this long. I have also tried using a try block with a finally to close the db.

EDIT:

public class DatabaseHelper {

private Database dbHelper;
private SQLiteDatabase db;
private Context context;

public DatabaseHelper(Context context) {
    this.context = context;
    //database = new Database(context);
}

public void open() {
    dbHelper = new Database(context);
    db = dbHelper.getWritableDatabase();
}

public void close() {
    dbHelper.close();
}

public void updateEvent(int id, String name, int other) {
    ContentValues cv = new ContentValues();
    cv.put("id", id);
    cv.put("name", name);
    cv.put("other", other);
    db.update("stateTable", cv, "id=" + id, null);
}

public boolean checkState(int id) {
    db = dbHelper.getReadableDatabase();
    Cursor cursor = db.query("stateTable", null, null, null, null, null, null);
    cursor.moveToPosition(id - 1);
    int i = cursor.getInt(2);
    android.util.Log.d("semajhan", ": " + i);
    if (i == 1) {
        return true;
    } else {
        return false;
    }
}

}

Extended SQLiteOpenHelper:

public class Database extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "events.db";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_NAME = "stateTable";
private static final String ID = "id";
private static final String NAME = "name";
private static final String OTHER = "other";
private static final String DATABASE_CREATE = "CREATE TABLE stateTable (id INT, name TEXT, other INT)";
private static final String DATABASE_UPGRADE = "DROP TABLE IF EXISTS table";

public Database(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
    db.execSQL(DATABASE_CREATE);
    // added initial values
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
    db.execSQL(DATABASE_UPGRADE);
    onCreate(db);
}

}

01-11 13:57:41.239: ERROR/ActivityManager(61): ANR in com.semajhan.soodles  (com.semajhan.soodles/.Level1)
01-11 13:57:41.239: ERROR/ActivityManager(61): Reason: keyDispatchingTimedOut
01-11 13:57:41.239: ERROR/ActivityManager(61): Load: 1.64 / 0.56 / 0.26
01-11 13:57:41.239: ERROR/ActivityManager(61): CPU usage from 35716ms to -1ms ago:
01-11 13:57:41.239: ERROR/ActivityManager(61):   44% 862/com.semajhan.soodles: 37% user + 7.2% kernel / faults: 853 minor
01-11 13:57:41.239: ERROR/ActivityManager(61):   29% 61/system_server: 27% user + 1.9% kernel / faults: 142 minor
01-11 13:57:41.239: ERROR/ActivityManager(61):   0.2% 731/com.android.quicksearchbox: 0% user + 0.2% kernel / faults: 30 minor
01-11 13:57:41.239: ERROR/ActivityManager(61):   0.2% 707/com.android.launcher: 0.2% user + 0% kernel / faults: 30 minor
01-11 13:57:41.239: ERROR/ActivityManager(61):   0.2% 801/com.svox.pico: 0.1% user + 0.1% kernel / faults: 363 minor
01-11 13:57:41.239: ERROR/ActivityManager(61):   0% 117/com.android.systemui: 0% user + 0% kernel
01-11 13:57:41.239: ERROR/ActivityManager(61):   0% 41/adbd: 0% user + 0% kernel
01-11 13:57:41.239: ERROR/ActivityManager(61): 99% TOTAL: 86% user + 13% kernel + 0% irq
01-11 13:57:41.239: ERROR/ActivityManager(61): CPU usage from 1969ms to 2620ms later:
01-11 13:57:41.239: ERROR/ActivityManager(61):   54% 61/system_server: 48% user + 6% kernel
01-11 13:57:41.239: ERROR/ActivityManager(61):     40% 69/SurfaceFlinger: 40% user + 0% kernel
01-11 13:57:41.239: ERROR/ActivityManager(61):     10% 92/InputDispatcher: 7.5% user + 3% kernel
01-11 13:57:41.239: ERROR/ActivityManager(61):     1.5% 62/HeapWorker: 1.5% user + 0% kernel
01-11 13:57:41.239: ERROR/ActivityManager(61):   44% 862/com.semajhan.soodles: 32% user + 12% kernel / faults: 2 minor
01-11 13:57:41.239: ERROR/ActivityManager(61):     24% 874/Thread-13: 24% user + 0% kernel
01-11 13:57:41.239: ERROR/ActivityManager(61):     23% 862/studios.soodles: 4.6% user + 18% kernel
01-11 13:57:41.239: ERROR/ActivityManager(61):     1.5% 867/Compiler: 0% user + 1.5% kernel
01-11 13:57:41.239: ERROR/ActivityManager(61):   0.8% 731/com.android.quicksearchbox: 0% user + 0.8% kernel
01-11 13:57:41.239: ERROR/ActivityManager(61):     0.8% 732/HeapWorker: 0% user + 0.8% kernel
01-11 13:57:41.239: ERROR/ActivityManager(61): 100% TOTAL: 76% user + 23% kernel

解决方案

The first call to getReadableDatabase or getWritableDatabase of the SQLiteOpenHelper instance takes a really long time to complete. You shouldn't create a new Database object (your SQLiteOpenHelper instance) each time that you need to query the database. Try using the same Database instance within DatabaseHelper.

When using SQLiteOpenHelper, you don't want to close the SQLiteDatabase object for an SQLiteOpenHelper because it is shared; i.e. getWritableDatabase always returns the same SQLiteDatabase object.

Notice that your checkState method leaks a cursor. To help prevent cursor leaks, I always use a try-finally after obtaining a cursor. For example:

    db = dbHelper.getReadableDatabase();
    Cursor cursor = db.query("stateTable", null, null, null, null, null, null);
    try {
        cursor.moveToPosition(id - 1);
        int i = cursor.getInt(2);
        android.util.Log.d("semajhan", ": " + i);
        if (i == 1) {
                return true;
        } else {
                return false;
        }
    } finally {
        cursor.close();
    }

这篇关于Android的sqlite的日志报告和db.close()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆