【问题标题】:SqlCipher attempt to write a readonly databaseSqlCipher 尝试写入只读数据库
【发布时间】:2014-07-12 22:28:48
【问题描述】:

我正在尝试为 android 实现 Sqlcipher。我将它用于多个活动,因此正在扩展 SQLiteOpenHelper {}。

我是这样的

我知道在第一次访问数据库之前不会调用 OnCreate 覆盖方法。

我的 oncreate 方法看起来像

@Override
public void onCreate(SQLiteDatabase db) {
    SQLiteDatabase.loadLibs(context);


    File databaseFile = context.getDatabasePath("SyncableDiabetesDatabase.db");
    databaseFile.mkdirs();
    databaseFile.delete();
    mDataBase = SQLiteDatabase.openOrCreateDatabase(databaseFile,SuperKey, null);

我正在尝试通过调用 this.getWritableDatabase(SuperKey); 来让 OnCreate 方法调用此方法;但是,当我运行此命令时,我收到错误

net.sqlcipher.database.SQLiteException:尝试写入只读数据库:PRAGMA user_version = 1

我不确定这是怎么可能的,因为该命令是针对可写数据库的

我知道 sqlcipher 已正确安装,因为我可以将 DB 创建代码放在 OnCreate 之外,并且数据已正确存储。但是,每次调用活动时都会覆盖该文件,因此我将其移至 OnCreate,它仅在创建表时调用一次。

这里的任何见解都将受到欢迎。

如果需要,我可以提供任何其他代码片段。

谢谢

【问题讨论】:

  • 您显示的代码都不属于onCreate()SQLiteOpenHelper。我强烈建议你先把 SQLCipher 放在一边,先学习如何使用 SQLite。您不妨阅读the documentation for how to use SQLite
  • 您好,我很欣赏 cmets,但我在 SQLite 方面拥有丰富的经验,并且自从应用程序创建以来就一直在此应用程序上运行它。我正在尝试迁移到 SqlCipher 作为额外的安全性。如果不在 onCreate 中,您建议在哪里访问数据库文件,因为它必须在应用程序打开之间持续存在,并且如果它在构造函数之外将被覆盖?并且只读数据库链接很有趣,但是当前的 SqlLite 数据库在 getWritable 方面没有问题

标签: java android sqlite sqlcipher


【解决方案1】:

您不需要在SQLiteOpenHelperonCreate 方法中调用SQLiteDatabase.openOrCreateDatabase,数据库实例已经作为参数提供给函数。使用SQLiteOpenHelper 的示例可以在here 找到。

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2015-10-27
    • 2018-07-03
    • 2017-09-27
    相关资源
    最近更新 更多