任何人都可以帮助告诉我我的代码有什么问题吗?我正在尝试连接到 SQLite 数据库,并执行一些查询。尝试创建和打开数据库,创建并插入表时,没有返回异常。但是当我尝试执行删除语句时,
DatabaseIOException: File system error (12)
总是回来。我不确切知道异常的原因。你能告诉我通常是什么导致这种异常吗?我什至不知道什么时候需要关闭数据库,什么时候不需要。 this solution也让我很困惑。
这是我的代码:
public class DatabaseManager {
Logger log = new Logger();
Database db;
public DatabaseManager() {
createDatabase();
}
private void createDatabase() {
// Determine if an SDCard is present
boolean sdCardPresent = false;
String root = null;
Enumeration enum = FileSystemRegistry.listRoots();
while (enum.hasMoreElements()) {
root = (String) enum.nextElement();
if(root.equalsIgnoreCase("sdcard/")) {
sdCardPresent = true;
}
}
if(!sdCardPresent) {
alert("This application requires an SD card to be present. Exiting application...");
}
else {
try {
URI uri = URI.create("/SDCard/databases/MyAdvanceUI/myadvanceui.db");
db = DatabaseFactory.openOrCreate(uri);
db.close();
//alert("Database OK!");
} catch (Exception e) {
// TODO Auto-generated catch block
//alert("Exception in createDatabase(): " + e);
}
}
}
private void alert(final String message) {
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
Dialog.inform(message);
System.exit(0);
}
});
}
private void createTableTask() {
try {
URI uri = URI.create("/SDCard/databases/MyAdvanceUI/myadvanceui.db");
db = DatabaseFactory.open(uri);
Statement st = db.createStatement("CREATE TABLE IF NOT EXISTS t_task (id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ "client TEXT, task TEXT)");
st.prepare();
st.execute();
st.close();
db.close();
//alert("Table Task created!");
} catch (Exception e) {
// TODO: handle exception
//alert("Exception in createTableTask(): " + e);
}
}
private void insertTableTask() {
String[] clients = { "Budi Setiawan", "Dian Kusuma", "Joko Ahmad", "Titi Haryanto", "Wahyu" };
String[] tasks = {
"Penawaran terhadap instalasi server",
"Follow up untuk keperluan produk terbaru",
"Pendekatan untuk membina relasi",
"Penawaran jasa maintenance",
"Penawaran terhadap instalasi database"
};
try {
URI uri = URI.create("/SDCard/databases/MyAdvanceUI/myadvanceui.db");
db = DatabaseFactory.open(uri);
for(int i = 0; i < clients.length; i++) {
Statement st = db.createStatement("INSERT INTO t_task (client, task) VALUES (?, ?)");
st.prepare();
st.bind(1, clients[i]);
st.bind(2, tasks[i]);
st.execute();
st.close();
}
db.close();
} catch (Exception e) {
// TODO: handle exception
//alert("Exception in insertTableTask(): " + e);
}
}
public void loadInitialData() {
createTableTask();
insertTableTask();
}
public Cursor getTasks() {
// TODO Auto-generated method stub
Cursor results = null;
try {
URI uri = URI.create("/SDCard/databases/MyAdvanceUI/myadvanceui.db");
db = DatabaseFactory.open(uri);
Statement st = db.createStatement("SELECT client, task FROM t_task");
st.prepare();
results = st.getCursor();
return results;
} catch (Exception e) {
// TODO: handle exception
//alert("Exception: " + e);
}
return results;
}
public void delete(String string) {
// TODO Auto-generated method stub
try {
URI uri = URI.create("/SDCard/databases/MyAdvanceUI/myadvanceui.db");
db = DatabaseFactory.open(uri);
Statement st = db.createStatement("DELETE FROM t_task WHERE client=?");
st.prepare();
st.bind(1, string);
st.execute();
} catch (Exception e) {
// TODO: handle exception
alert("Exception: " + e);
}
}
}
感谢您的帮助。
最佳答案
没看到你在select
之后关闭语句并关闭数据库和 delete
行动。很可能您无法打开数据库,因为它没有正确关闭。
大警告当用户将设备作为外部驱动器安装到 PC 时,SD 卡不可用。有些设备没有预装 SD 卡。 5 个操作系统设备上的数据库操作真的很慢。您的 alert
方法代码不会关闭数据库在下一次应用程序启动后打开它可能会出现什么问题。
警告 正如@pankar 在评论中提到的,您应该添加 finally {}
你肯定会在哪里关闭资源。在您当前的实现中,如果您在执行中遇到异常,您将永远不会关闭数据库。
大改进您不需要在每个循环中都创建和准备语句。在 for
之前做.绑定(bind)并执行每个循环。并在 for
之后关闭语句.
改进 您可以在应用程序运行周期中保留一个打开的数据库。它将为您节省一些代码行和打开关闭的时间。
符号 将参数命名为“字符串”是一种不好的做法。我会把它重命名为更有意义的东西。
关于sqlite - 执行查询时出现 DatabaseIOException "Delete",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11900618/