android - 外部生成的 SQLite 数据库被 Android 的 SQLiteOpenHelper 视为只读

标签 android sqlite

我有一个 SQLite 数据库,它是使用找到的 SQLite JDBC 连接器生成的 here .

然后我将这个数据库复制到我的 Android 手机的 SD 卡中,并尝试使用 SQLiteOpenHelper 打开它。我得到以下异常:

ERROR/SQLiteOpenHelper(7373): android.database.sqlite.SQLiteException: attempt to write a readonly database: BEGIN EXCLUSIVE;

ERROR/AndroidRuntime(7373): Caused by: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 0 to 1: /mnt/sdcard/4Trak/4Trak.db

这对我来说没有任何意义。为什么它是只读数据库?我能够首先写入它以生成它,当我意识到我需要一个 android_metadata 表时,我又一次使用 SQLite 浏览器添加了它。

最佳答案

Sqlite 只会从您的应用程序数据库目录中打开数据库。

DB_PATH = "/data/data/"+ context.getPackageName() + "/databases/"; 

为了读写你的数据库,我的理解是你需要将你的数据库复制到这个位置:

InputStream myInput = myContext.getAssets().open(DB_NAME);      
String outFileName = DB_PATH + DB_NAME;     
OutputStream myOutput = new FileOutputStream(outFileName);

byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
    myOutput.write(buffer, 0, length);
}

myOutput.flush();
myOutput.close();
myInput.close();

为了进行此复制,您首先必须在数据库文件的最终目的地打开一个数据库:

checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

有问题可以私信我

关于android - 外部生成的 SQLite 数据库被 Android 的 SQLiteOpenHelper 视为只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4753896/

相关文章:

java - 检查 Android 中的 UI 元素

按下电源按钮后,Android 12 SplashScreen API 显示黑色

android - onEngineListener 在 android 6.0 中返回 UNKNOWN 错误

sqlite - 如何在 swift 中捆绑预填充的数据库

sql - 获取 SQL 查询中每个不同记录的最大平均值

android - Picasso 单例用法

安卓 DatePicker- GregorianCalendar-00 :00:00 UTC - getTimeInMillis()

javascript - HTML 5 SQLite : Multiple Inserts in One Transaction

ruby-on-rails - rails/事件记录 : Get a record made *AFTER* a particular date

javascript - 使用 sqlite 和 Expo 从 SQL 查询中获取实际的行数组