Blackberry没有创建有效的sqlite数据库

时间:2013-08-08 08:34:32

标签: sqlite blackberry

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

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

然而,对于我当前的项目,偶尔有 错误。基本上没有正确创建数据库。它被添加到SD卡中,但是当我访问它时,我得到DatabaseException

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

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

代码

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;
}

2 个答案:

答案 0 :(得分:2)

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

我不是一个很好的答案。

答案 1 :(得分:1)

由于您的问题似乎是用户正在删除您的数据库,因此请确保在您打开它时捕获异常(或访问它...在您获得异常的任何地方):

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 Corruption

See this link describing the many ways SQLite databases can be corrupted。这肯定听起来像是.db文件被删除了,但不是日志/沃尔玛文件。如果是这样,您可以在创建database1*之前尝试以编程方式删除database1.db。但是,你的评论似乎表明它是另一回事。也许您也可以查看文件锁定失败模式。

如果您绝望,可以尝试更改代码以在每次创建新数据库时使用其他名称(例如database2database3),以确保您没有获取工件来自之前的数据库。