【问题标题】:How to solve errors in Codename One when loading sqlite db file (simulator & device)?加载 sqlite db 文件(模拟器和设备)时如何解决 Codename One 中的错误?
【发布时间】:2017-09-26 00:20:09
【问题描述】:

我正在尝试将由 DB Browser for SQLite 创建的预加载 .db 文件复制到我在 Codename One 中制作的应用程序中。我已将应用程序放入我的 src 文件夹和 theme.res 文件夹(在 Data 下),并将以下代码添加到我的应用程序打开类的 init() 方法中:

 String path = Display.getInstance().getDatabasePath("mydb.db");

    Log.p("init path = " + path);
    FileSystemStorage fs = FileSystemStorage.getInstance();

    if(path != null && !fs.exists(path)) {
        Log.p("path != null ");
        try (OutputStream os = fs.openOutputStream(path);
        InputStream is = Display.getInstance().getResourceAsStream(getClass(), "/mydb.db");
             ) {
            Util.copy(is, os);
        } catch (IOException err) {
            Log.e(err);
            //copyDb(path);
        }
    }

path返回一个变量。运行 模拟器 时,我收到以下错误消息:

java.sql.SQLException: [SQLITE_CORRUPT]  The database disk image is malformed (database disk image is malformed)

在我的 Android 设备上,我收到以下消息:

Exception: android.database.sqlite.SQLiteException - no such table:

关于如何解决这个问题的任何想法?

谢谢!

【问题讨论】:

  • UCSConstantsAndCommons.DB & UCSConstantsAndCommons.DB_PATH的值是多少
  • "mydb.db" 和 "/mydb.db" 分别。我在上面做了这些更改。

标签: android ios sqlite codenameone


【解决方案1】:

我猜测变量的值不正确并产生错误的结果。由于这发生在模拟器上,因此很容易调试。只需检查用户主目录中.cn1 目录下的文件是否正确即可。

【讨论】:

  • 当我检查那个文件夹时,我只有一个空的 localstorage 文件夹和 .lock 文件。我的数据库去哪儿了?
  • 这意味着文件没有被复制到位。这可能是因为缺少数据库目录,在这种情况下这可能是一个错误。在.cn1 目录中创建文件夹database 并查看它是否可以解决此问题,如果可以,我们需要修复它。我的东西getDatabasePath 应该隐式创建该目录,如果它不存在
  • 感谢@Shai Almog。就我而言,我尝试在 Sqlite 浏览器中打开我的 db 文件并收到一条消息,指出数据库格式错误,类似于我在尝试通过模拟器运行它时看到的消息。当我用备用文件替换那个 db 文件,将它放在 src 文件夹中并替换我的代码中的文件名时,幸运的是它起作用了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 2015-08-28
  • 2019-09-04
  • 2019-10-27
相关资源
最近更新 更多