Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQLiteOpenHelper如何返回SQLiteDatabase?_Java_Android - Fatal编程技术网

Java SQLiteOpenHelper如何返回SQLiteDatabase?

Java SQLiteOpenHelper如何返回SQLiteDatabase?,java,android,Java,Android,我知道SQLiteDatabase没有任何公共构造函数,我无法直接创建它的对象 但是SQLiteOpenHelper如何使用getReadableDatabase或getWritableDatabase返回SQLiteDatabase引用呢?仅仅因为构造函数不是公共的/可见的并不意味着它不存在 SQLiteOpenHelper使用SQLiteDatabase的静态构造函数openDatabase创建新的数据库实例。它是公开的,并没有被隐藏,所以,尽管这可能不是一个好主意,你可以直接称之为你自己

我知道SQLiteDatabase没有任何公共构造函数,我无法直接创建它的对象


但是SQLiteOpenHelper如何使用getReadableDatabase或getWritableDatabase返回SQLiteDatabase引用呢?

仅仅因为构造函数不是公共的/可见的并不意味着它不存在

SQLiteOpenHelper使用SQLiteDatabase的静态构造函数openDatabase创建新的数据库实例。它是公开的,并没有被隐藏,所以,尽管这可能不是一个好主意,你可以直接称之为你自己

根据以下说明,您可以这样使用它:

   SQLiteDatabase db = SQLiteDatabase.openDatabase(path, null); 
第一个参数是一个字符串,给出新数据库的完整路径名。第二个是游标工厂。为第二个参数传递null将获得默认工厂

使用SQLiteOpenHelper可以保证正确创建和初始化数据库。它还可以正确缓存数据库实例,这样就不会在每次需要时重新创建它们。使用它可能更好。

试试这个:

类Cdb.java:

public class Cdb extends SQLiteOpenHelper {

    private static final String DB_NAME = "db_name.db";
    public static final int DB_VERSION = 1;

    Cdb(Context context) {
        super(context.getApplicationContext(), DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
        // Upgrade here
    }

    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);

}
然后您可以按如下方式访问数据库:

Cdb openHelper = new Cdb(this);
SQLiteDatabase db = openHelper.getReadableDatabase();

请看,我假设createDatabase和openDatabase函数调用SQLiteDatabase的private或protected(不确定)构造函数,因为静态函数是在SQLiteDatabase中声明的。SQLiteOpenHelper在内部调用这些函数。@Jakar你能给我看一些演示Java代码来理解你的回答吗?SQLiteDatabase和SQLiteOpenHelper的代码是开源的,你可以查看它是如何工作的。请参阅中的particular@Barun,如果您在几个小时内没有接受答案,我将发布一些示例代码来解释它是如何工作的。虽然SQLiteDatabase.openDatabase实际上不是构造函数,但我不知道应该如何调用它。我不确定静态构造函数是否是最好的术语。@njzk2如果对Joshua Bloch有效,它对我也有效。@G.BlakeMeike在android sdk/sources/android-19/android/database/sqlite上查看了源文件后,我相信您的答案是正确的。谢谢@Barun!看看源代码,我是怎么得到它的!您的代码已经显示在Android文档中,我理解它,但我想知道的是以这种方式获取引用的任何与Java相关的原因。@Barun以这种方式获取引用的原因是,所有db创建/升级代码都在一个文件中。看看这个和这个