我是 Android 编程的新手,对 SQL 及其与 Java 的交互几乎没有经验,但我无法在教程或 Google 的开发者页面中找到我正在寻找的答案。
我想知道如何在 Android 中创建一个数据库来存储各种 String 和 int 变量而不创建重复的数据库。我理解开发页面呈现的模式和契约类概念,但我不明白我应该如何调用类方法以便只创建一个数据库(最好是在第一次应用程序启动时) 没有创建多个实例。
我的主要问题:建议使用哪种设置来创建可以从其他类引用的数据库,该数据库从应用程序首次启动时就存在,并且保持私有(private)(尽管老实说这不是一个重要的优先事项)?
最佳答案
but I don't understand how I am supposed to call a class method so that only a single database is created (preferably at first app launch)
在 Android 中,数据库只创建一次,然后在您尝试执行 CRUD
时创建。操作和选择语句,您将始终只创建一个数据库。数据库中的表也是如此。一旦创建了表,它们将不会再次创建(如果表是在没有新列的情况下创建的,那么在实现过程中向表添加新列时要小心1上>)。此外,如果用户明确删除应用程序数据 - 仅在这种情况下,数据库和表将被重新创建,因为它们已被删除。
What sort of setup is recommended to create a database that can be referenced from other classes, exists from the very first launch of the app
在您调用例如 getWriteableDatabase() 或 getReadableDatabase() 时,数据库和表将被创建 - 仅在此时!只有一次。不再(1 除外。之后,每当您尝试从/写入数据库时,您的数据库将以特定权限打开(读写或只读 - 这取决于您调用的方法)以及您可以执行的操作。
without several instances being created.
数据库只有一个 - 它没有(物理上)重复,绝对是,但是当应用程序逻辑没有正确指定时,可能会出现多个数据库实例,这个事实不是很好,通常是许多 Android 和 SQLite 初学者的噩梦.
但是解决方案存在并且实现起来并不难->
单例。 Design pattern Singleton 对于我们的目标来说是“非常酷的工具” - 确保只会创建一个数据库实例。
这是单例本身的实现:
public class DataSource extends SQLiteOpenHelper {
private static DataSource instance;
public static final DataSource getInstance(Context c) {
if (instance == null) {
instance = new DataSource(c);
}
return instance;
}
}
1 如果您在之前创建数据库和表时向表中添加了新列(我在上面提到它们只创建了一次),则可能会导致应用程序异常所以你必须清除应用程序数据或implement onUpgrade() method .
关于java - 如何防止在 Android 应用程序中创建多个数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20271625/