我有一个非常不寻常的问题。
我正在尝试创建一个简单的数据库(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;
}
答案 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存储。
See this link describing the many ways SQLite databases can be corrupted。这肯定听起来像是.db文件被删除了,但不是日志/沃尔玛文件。如果是这样,您可以在创建database1*
之前尝试以编程方式删除database1.db
。但是,你的评论似乎表明它是另一回事。也许您也可以查看文件锁定失败模式。
如果您绝望,可以尝试更改代码以在每次创建新数据库时使用其他名称(例如database2
,database3
),以确保您没有获取工件来自之前的数据库。