当使用内容提供程序时重新创建数据库

7
我的Android应用有一个SQLite数据库和一个内容提供者(Content Provider)。这个内容提供者在应用的AndroidManifest.xml中注册。它没有被导出,所以只有我的应用可以看到它。
作为重置用户配置文件的一部分,我想完全清除这个数据库并从头开始重新创建。起初,我尝试从活动的上下文(context)中调用deleteDatabase()。这样做是可行的,但只有在应用关闭并重新打开后才有效。否则,在插入行时会崩溃,显示数据库是只读的。我的理解是在调用deleteDatabase()之前需要先关闭连接。然而,连接由内容提供者管理,不应该手动关闭,据我所知。
作为替代方法,我使用ContentResolver中的call()方法来调用一个自定义函数,该函数将删除表中的所有数据并手动重置序列计数。这种方法虽然可行,但现在我必须手动从每个表中删除数据,并且将来也要跟踪任何更改。
是否有更好的方法来删除整个数据库,并在使用ContentProvider时触发我的DatabaseHelper(SQLiteOpenHelper)的onCreate()

为什么你想重新创建而不是删除所有内容? - Diego Torres Milano
@DiegoTorresMilano 我想我只是想快速刷新数据库到一个新的状态,而不必删除每个表/行(因此尝试调用deleteDatabase),并让初始设置过程重新配置新的配置文件,就像第一次运行时一样。目前,我正在删除所有数据行,我只是好奇是否有类似于调用deleteDatabase的东西可以工作。 - Programmer001
1
在文件仍然打开的情况下,您不应尝试删除该文件。 - CL.
没错。我希望有一种方法可以关闭连接,删除文件并重新启动连接。但看起来这样做可能不太可行。也许当时我只是想得太多了 :) - Programmer001
1个回答

1
一种建议是让您的自定义函数删除表并重新创建它们。您已经有了在DatabaseHelperonCreate()中创建表的代码。将其重构到可由DatabaseHelper和自定义方法访问的位置。

好的。在deleteDatabase无法工作后,我开始通过删除表来解决问题,但后来决定仅删除它们的所有行并重置它们的序列计数器,而不调用onCreate。您的答案也可以。请参见我对Diego的回复以了解更多原因。如果没有其他答案,我可以接受这个答案。 - Programmer001

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接