如何在我的应用程序中使用外部数据库而无需root权限?

时间:2011-08-23 03:28:34

标签: android database external

我们都知道android系统数据库应该存储在/ data / data / package name /目录中,我想在我的应用程序中使用现有的数据库。

有些人可能会告诉我只是将原始数据库放在/ res / raw /目录中,然后使用FileInputStream来读取它,读入FileOutStream来写入该目录。这是一个好主意,

但问题是并非所有手机都有root访问权限才能访问系统目录,而且我不能只将db文件放在SD卡中并从那里读取数据,因为你不知道如果手机中还有SD卡。我真的不知道这个,有人能帮我一把吗?我很欣赏。

1 个答案:

答案 0 :(得分:0)

我有一个80兆字节的SQLite数据库,我是从Microsoft Access 10转换而来的。我将其下载到1)手机的SD卡,2)sdcard-ext或3)内部存储,具体取决于可用空间。 SQLite数据库是使用SQLite 3.7.4在PC上创建的。从版本2.2(8)开始,它在Androids上运行良好。为了处理,我创建了一个不使用open helper的DatabaseAdapter类。

这是从我的DatabaseAdapter类打开的数据库:

public DatabaseAdapter open() {
    MyLog.d(TAG, "open");
    try {
        String databaseFile = databasePath + File.separator
                + GC.DATABASE_NAME;
        theDB = SQLiteDatabase.openDatabase(databaseFile, null,
                SQLiteDatabase.OPEN_READONLY
                        | SQLiteDatabase.NO_LOCALIZED_COLLATORS);
    } catch (SQLiteException e) {
        MyLog.d(TAG, "open error: " + e.getMessage());
        theDB = null;
    }
    if (theDB == null) {
        return null;
    }
    return this;
}

构造函数传递路径。使用顺序是

    DatabaseAdapter dbAdapter = new DatabaseAdapter(databasePath);

    if (dbAdapter.open() == null) {
        // ooops. no database open...
        return;
    }

    Cursor cursor = dbAdapter.someQuery(arg1, where, limit);
    if (cursor != null)
        while (cursor.moveToNext()) {
           field1 = cursor.getString(0);
           // etc.
        }
        cursor.close();
    }

    dbAdapter.close();

外部数据库打开的关键是NO_LOCALIZED_COLLATORS标志。没有它,open将尝试访问Android创建的本地化表。创建外部数据库时,不会创建表格,并且在手机上运行时,会发现未找到的表格。

要确定要用于数据库的路径,请使用Environment.getExternalStorageState()并相应地使用sdcard或内部存储。

使用getExternalStorageDirectory()获取sdcard目录。使用this.getApplicationContext()。getFilesDir()                     .getPath()获取内部存储路径。假设您将本地或外部路径导入databasePath,您可以将数据库下载到创建为

的输出文件中

文件downloadOutput = new File(databasePath,“mysqlite.db”);

下载后,您可以使用上面所示的open()来准备数据库以进行访问。 (注意:数据库可以打开为可写,而不仅仅是如图所示只读。)

希望我没有解释......