【问题标题】:Blackberry not creating a valid sqlite database黑莓没有创建有效的 sqlite 数据库
【发布时间】:2013-08-08 08:34:31
【问题描述】:

我有一个非常不寻常的问题。

我正在尝试创建一个简单的数据库(6 个表,其中 4 个只有 2 列)。 我正在使用我在以前的项目中使用过的内部数据库库,它确实有效。

但是,在我当前的项目中,偶尔会出现错误。基本上数据库没有正确创建。它已添加到 sdcard,但当我访问它时,我得到一个 DatabaseException

当我从桌面管理器访问设备并尝试打开数据库(使用 SQLite 数据库浏览器 v2.0b1)时,我得到“文件不是 SQLite 3 数据库”。

更新
我发现当我从 sdcard 中手动删除数据库时会发生这种情况。 既然没有办法阻止用户这样做,我能做些什么来处理它吗?

代码

public static boolean initialize()
{
    boolean memory_card_available = ApplicationInterface.isSDCardIn();
    String application_name = ApplicationInterface.getApplicationName();
    if (memory_card_available == true)
    {
        file_path = "file:///SDCard/" + application_name + ".db";
    }
    else
    {
        file_path = "file:///store/" + application_name + ".db";
    }

    try
    {
        uri = URI.create(file_path);
        FileClass.hideFile(file_path);
    } catch (MalformedURIException mue)
    {
    }

    return create(uri);
}

private static boolean create(URI db_file)
{
    boolean response = false;

    try
    {
        db = DatabaseFactory.create(db_file);
        db.close();

        response = true;
    } catch (Exception e)
    {
    }

    return response;
}

【问题讨论】:

    标签: sqlite blackberry


    【解决方案1】:

    我唯一的建议是在您的资产中保留一个默认数据库 - 如果 SD 卡上的数据库有问题,请尝试通过复制默认数据库来重新创建它。

    我期望的不是一个很好的答案。

    【讨论】:

    • 有趣的建议。从来没想过
    【解决方案2】:

    由于您的问题似乎是用户正在删除您的数据库,因此请确保在您打开它时捕获异常(或访问它......无论您遇到什么异常):

    try {
        URI uri = URI.create("file:///SDCard/Databases/database1.db");
        sqliteDB = DatabaseFactory.open(myURI);
        Statement st = sqliteDB.createStatement( "CREATE TABLE 'Employee' ( " +
                                                  "'Name' TEXT, " +
                                                  "'Age' INTEGER )" );               
        st.prepare();
        st.execute();
    } catch ( DatabaseException e ) {         
        System.out.println( e.getMessage() );
    
        // TODO: decide if you want to create a new database here, or 
        // alert the user if the SDCard is not available
    }
    

    请注意,即使用户删除您的应用创建的私人文件可能是不寻常的,但由于设备通过 USB 连接到 PC,因此 SDCard 不可用是完全正常的。所以,你真的应该一直测试这种情况(文件打开错误)。

    See this answer regarding checking for SDCard availability.

    另外,read this about SQLite db storage locations,并确保review this answer by Michael Donohue 了解 eMMC 存储。


    更新:SQLite 损坏

    See this link describing the many ways SQLite databases can be corrupted。在我看来,这绝对听起来像是 .db 文件被删除了,而不是 journal / wal 文件。如果是这样,您可以在创建database1.db 之前尝试以编程方式删除database1*。但是,您的 cmets 似乎暗示这是另一回事。也许您也可以查看文件锁定失败模式。

    如果您不顾一切,您可以尝试在每次创建新数据库时更改代码以使用不同的名称(例如 database2database3),以确保您不会从以前的数据库中获取工件.

    【讨论】:

    • 谢谢 nate,我会看看这些链接。然而,问题不是没有创建数据库,而是文件创建不正确。出现在文件系统上,但不是有效的数据库文件。
    • 我以为您的更新说问题是用户在您的应用创建文件后手动删除文件?我误解了那部分吗?
    • 哦,对不起,如果我混淆了。我可以很好地创建一个数据库。如果我从 sdcard 中删除它,那么下次我运行应用程序时它不会正确创建数据库。
    • @Kevin,您是否只是将 SDCard 安装在您的 PC 上,然后使用普通的文件资源管理器应用程序将其删除?您的 PC 运行哪个操作系统?另外,如果数据库名为database1.db,那么您是否看到在名为database1.* 的SDCard 上创建了任何其他文件?名称相同,但文件扩展名不同?
    • 我刚刚复制了它。日志文件不存在。我还显示了所有隐藏文件,它也不存在。只有database1.db 存在
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多