【问题标题】:Is it good idea to close db in Insert method of db helper?在数据库助手的插入方法中关闭数据库是个好主意吗?
【发布时间】:2013-11-26 09:53:21
【问题描述】:

看看我的 DbHelper 类。我认为db.close() 命令在命令中产生了一些错误。
在我使用过getReadableGetWritable 的每种方法中,我都尝试过this.close();

这是我的DbHelper

 public class DbHelper extends SQLiteOpenHelper{

private SQLiteDatabase db;

public DbHelper(Context context) {
    super(context, "shareholders.db", null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    try {
        this.db = db;
        String sql = "CREATE TABLE IF NOT EXISTS news (id integer,title text,description text,sDate text)";
        db.execSQL(sql);


    } catch (Exception e) {
        xLog.error(e.getMessage());
    }


    ContentValues cv = new ContentValues();
    cv.put("name", "Username");
    cv.put("value", "default");
    db.insert("settings", null, cv);

    cv.clear();
    cv.put("name", "Password");
    cv.put("value", "default");
    db.insert("settings", null, cv);

    cv.clear();
    cv.put("name", "PersonId");
    cv.put("value", "default");
    db.insert("settings", null, cv);

    cv.clear();
    cv.put("name", "picture");
    cv.put("value", "");
    db.insert("settings", null, cv);
}

@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
    // TODO Auto-generated method stub

}

public long insert(String table,ContentValues cv){
    SQLiteDatabase mydb =this.getWritableDatabase();
    long result=-1;
    try {
        result = mydb.insert(table,null, cv);
        }catch (Exception e) {
        xLog.error(e.getMessage());
    }
    this.close();
    return result;
}

public Cursor selectAll(String table){
    SQLiteDatabase mydb =this.getReadableDatabase();
    String sql = "SELECT * FROM "+table;
    xLog.info(sql);
    Cursor result=null;
    try {
        result = mydb.rawQuery(sql, null);
    } catch (Exception e) {
        xLog.error(e.getMessage());
    }
    this.close();
    return result;
}

public Cursor select(String table,String where){
    SQLiteDatabase mydb =this.getReadableDatabase();
    String sql = "SELECT * FROM "+table+" WHERE "+where;
    xLog.info(sql);

    Cursor result=null;
    try {
        result = mydb.rawQuery("SELECT * FROM "+table+" WHERE "+where, null);
    } catch (Exception e) {
        xLog.error(e.getMessage());
    }
    this.close();
    return result;
}

public long delete(String table,String condition){
    SQLiteDatabase mydb =this.getWritableDatabase();
    long result = -1;
    try {
        result = mydb.delete(table, condition, null);
    } catch (Exception e) {
        xLog.error(e.getMessage());
    }
    this.close();
    return result;
}

protected long empty(String table){
    SQLiteDatabase mydb =this.getWritableDatabase();
    long result = -1;
    try {
        result = mydb.delete(table, "", null);
    } catch (Exception e) {
        xLog.error(e.getMessage());
    }
    this.close();
    return result;
}

public long update(String table,ContentValues cv,String condition){
    SQLiteDatabase mydb =this.getWritableDatabase();
    long result = -1;
    try {
        result = mydb.update(table, cv, condition, null);
    } catch (Exception e) {
        xLog.error(e.getMessage());
    }
    this.close();
    return result;
}

protected void drop(String table){
    //TODO Produces a damn error!
    db.execSQL("DROP TABLE IF EXISTS "+table);
}

}

这是我的日志猫:

11-26 13:12:20.738: W/System.err(2238): org.xmlpull.v1.XmlPullParserException: unexpected type (position:END_DOCUMENT null@1:0 in java.io.InputStreamReader@43e80ca8) 
11-26 13:12:20.738: W/System.err(2238):     at org.kxml2.io.KXmlParser.exception(KXmlParser.java:273)
11-26 13:12:20.738: W/System.err(2238):     at org.kxml2.io.KXmlParser.nextTag(KXmlParser.java:1420)
11-26 13:12:20.738: W/System.err(2238):     at org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:126)
11-26 13:12:20.738: W/System.err(2238):     at org.ksoap2.transport.Transport.parseResponse(Transport.java:96)
11-26 13:12:20.738: W/System.err(2238):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:189)
11-26 13:12:20.745: W/System.err(2238):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:95)
11-26 13:12:20.745: W/System.err(2238):     at ClassLibrary.WebService.CallMethod(WebService.java:49)
11-26 13:12:20.745: W/System.err(2238):     at ClassLibrary.AsyncCallWs.doInBackground(AsyncCallWs.java:64)
11-26 13:12:20.745: W/System.err(2238):     at ClassLibrary.AsyncCallWs.doInBackground(AsyncCallWs.java:1)
11-26 13:12:20.745: W/System.err(2238):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
11-26 13:12:20.745: W/System.err(2238):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
11-26 13:12:20.745: W/System.err(2238):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-26 13:12:20.745: W/System.err(2238):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
11-26 13:12:20.745: W/System.err(2238):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
11-26 13:12:20.745: W/System.err(2238):     at java.lang.Thread.run(Thread.java:1096)

【问题讨论】:

  • 是的,正如 Geralt 所提到的,对于您的整个应用程序,只有一个帮助程序类或数据库实例是一种更好的做法。
  • @Tamilselvan 如何以这种方式更改我的课程?可以帮助我吗?
  • 创建一个应用程序类并在该应用程序类本身中为数据库助手类创建公共静态实例,并在所有活动类中使用此实例。
  • 首先插入值得到可写数据库。 SQLiteDatabase 数据库 = this.getWritableDatabase();然后插入

标签: android sqlite


【解决方案1】:

异常与代码无关但有问题:

this.db = db;

您正在存储对 SQLiteDatabase 的引用,而您自己并没有使用例如getReadableDatabase()getWritableDatabase()

protected void drop(String table){
    //TODO Produces a damn error!
    db.execSQL("DROP TABLE IF EXISTS "+table);
}

这里您使用的是指向可能已经关闭的数据库连接的存储引用。在此处使用getWritableDatabase() 获取数据库参考。另外,删除SQLiteDatabase 成员变量。反正你也不需要。

内部SQLiteDatabase 连接被引用计数。如果数据库已经打开,再次打开它只会增加现有连接的引用计数。调用close() 将减少引用计数器,一旦它恰好达到零,数据库就会关闭。

传递给onCreate()的数据库引用由Android数据库框架打开和关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2019-04-13
    • 2011-11-03
    • 1970-01-01
    • 2013-04-05
    相关资源
    最近更新 更多