Android/sqlite 检测表是否包含列

发布于 2024-08-29 05:09:55 字数 395 浏览 3 评论 0原文

所以我在市场上有一个应用程序,通过更新我想向数据库添加一些列。到目前为止没有问题。但我想检测正在使用的数据库是否缺少这些列,如果是这种情况,请添加它们。我需要动态完成此操作,而不仅仅是在更新到新版本后完成,因为应用程序应该仍然能够导入旧数据库。通常我可以使用 PRAGMA 查询,但我不确定如何使用 Android 执行此操作。我无法使用 execSQL,因为它是一个查询,而且我无法弄清楚如何将 PRAGMA 与 query() 函数一起使用。

当然,我可以捕获异常,然后添加列,或者在开始使用每个表之前始终将列添加到每个表中,但这不是一个巧妙的解决方案。

干杯,

So I have an app on the market, and with an update I want to add some columns to the database. No problems so far. But I want to detect if the database in use is missing these columns, and add them if this is the case. I need this to be done dynamically and not just after the update to the new version, because the application is supposed to still be able to import older databases. Normally I would be able to use the PRAGMA query, but Im not sure how to do this with Android. I cant use execSQL since it is a query, and I cant figure out how to use PRAGMA with the query()-function.

Ofcourse I could just catch exceptions and then add the column, or always add the columns to each table before I start to work with it, but that is not a neat solution.

Cheers,

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

怪我入戏太深 2024-09-05 05:09:55

杂注起作用了。作为一个例子,我刚刚在我的一个 Android 应用程序数据库上尝试过它。

sqlite> pragma table_info (userCommand);

cid name        type    notnull     dflt_value  pk
0   id      INTEGER     0       1
1   description TEXT    0       0
2   message     TEXT    0       0

我们可以看到指定表中有三个字段。 ID、描述和消息。

因此,在您的应用程序中,请使用以下内容:

Cursor c = null;
c = RawQuery ("pragma table_info (userCommand)",null); 
// if c has records and is not null then iterate through the records in search of your table name. 

请原谅格式不当。

Pragma works. As an example I just tried it on one of my Android App DBs.

sqlite> pragma table_info (userCommand);

cid name        type    notnull     dflt_value  pk
0   id      INTEGER     0       1
1   description TEXT    0       0
2   message     TEXT    0       0

As we can see there are three fields in the specified table. id, description, and message.

So in your app, use something like:

Cursor c = null;
c = RawQuery ("pragma table_info (userCommand)",null); 
// if c has records and is not null then iterate through the records in search of your table name. 

Please excuse the poor formatting.

幸福%小乖 2024-09-05 05:09:55

这可能有点过头了,但您可以从表中选择一行到 Cursor 中并使用 Cursor.getColumnIndex([column name as string])。如果不存在则返回-1。

This may be overkill, but you can select a single row from your table into a Cursor and use Cursor.getColumnIndex([column name as string]). This will return -1 if it doesn't exist.

白芷 2024-09-05 05:09:55

尝试将 PRAGMArawQuery() 一起使用,而不是 query()

Try using PRAGMA with rawQuery() instead of query().

Spring初心 2024-09-05 05:09:55

您可以发出以下命令并查看结果并查看您的列是否已列出。

pragma table_info(table_name);

编辑:我从未在 Android 上这样做过,但我认为它应该可以工作

You could issue the following command and go over the results and see if your column is listed.

pragma table_info(table_name);

Edit: I've never done this on Android, but I think it should work

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文