在 Android 中使用内容提供程序公开多个表的最佳实践
我正在构建一个应用程序,其中有一张活动表和一张场地表。我希望能够授予其他应用程序访问此数据的权限。我有一些与此类问题的最佳实践相关的问题。
我应该如何构建数据库类? 我目前有 EventsDbAdapter 和 VenuesDbAdapter 类,它们提供查询每个表的逻辑,同时有一个单独的 DbManager (扩展 SQLiteOpenHelper)用于管理数据库版本、创建/升级数据库、提供对数据库的访问(getWriteable/ReadeableDatabase)。这是推荐的解决方案,还是我最好将所有内容合并到一个类(即 DbManager)或分离所有内容并让每个适配器扩展 SQLiteOpenHelper?
我应该如何为多个表设计内容提供程序? 延伸上一个问题,我应该为整个应用程序使用一个内容提供程序,还是应该为活动和场地创建单独的提供程序?
我发现的大多数示例仅涉及单表应用程序,因此我将不胜感激。
I'm building an app where I have a table for events and a table for venues. I want to be able to grant other applications access to this data. I have a few questions related to best practices for this kind of problem.
How should I structure the database classes?
I currently have classes for EventsDbAdapter and VenuesDbAdapter, which provide the logic for querying each table, while having a separate DbManager (extends SQLiteOpenHelper) for managing database versions, creating/upgrading databases, giving access to database (getWriteable/ReadeableDatabase). Is this the recommended solution, or would I be better off either consolidating everything to one class (ie. the DbManager) or separation everything and letting each Adapter extends SQLiteOpenHelper?How should I design content providers for multiple tables?
Extending the previous question, should I use one Content Provider for the whole app, or should I create separate providers for Events and Venues?
Most examples I find only deal with single table apps, so I would appreciate any pointers here.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这对您来说可能有点晚了,但其他人可能会发现这很有用。
首先,您需要创建多个 CONTENT_URI
然后扩展 URI 匹配器
然后创建表
不要忘记将第二个
DATABASE_CREATE
添加到onCreate()
您将使用switch-case 块来确定使用哪个表。这是我的插入代码,
您将需要划分
delete
、update
、getType
等。无论您的提供程序在何处调用 DATABASE_TABLE 或 CONTENT_URI,您都可以将添加一个案例,并在其中一个中包含 DATABASE_TABLE1 或 CONTENT_URI1,在下一个中包含 #2,依此类推,可以添加任意数量的案例。It's probably a bit late for you, but others may find this useful.
First you need to create multiple CONTENT_URIs
Then you expand your URI Matcher
Then create your tables
Don't forget to add the second
DATABASE_CREATE
toonCreate()
You are going to use a switch-case block to determine what table is used. This is my insert code
You will need to devide up the
delete
,update
,getType
, etc. Wherever your provider calls for DATABASE_TABLE or CONTENT_URI you will add a case and have DATABASE_TABLE1 or CONTENT_URI1 in one and #2 in the next and so on for as many as you want.我建议查看 Android 2.x ContactProvider 的源代码。 (可以在网上找到)。它们通过提供专门的视图来处理跨表查询,然后您可以在后端运行查询。在前端,调用者可以通过单个内容提供商通过各种不同的 URI 访问它们。您可能还需要提供一两个类来保存表字段名称和 URI 字符串的常量。这些类可以作为 API 包含或作为类中的下降提供,并且将使消费应用程序更容易使用。
它有点复杂,所以您可能还想查看日历,以了解您需要什么和不需要什么。
您应该只需要每个数据库(而不是每个表)一个数据库适配器和一个内容提供程序来完成大部分工作,但如果您确实愿意,可以使用多个适配器/提供程序。它只会让事情变得更复杂一些。
I recommend checking out the source code for the Android 2.x ContactProvider. (Which can be found online). They handle cross table queries by providing specialized views that you then run queries against on the back end. On the front end they are accessible to the caller via various different URIs through a single content provider. You'll probably also want to provide a class or two for holding constants for your table field names and URI strings. These classes could be provided either as an API include or as a drop in class, and will make it much easier for the consuming application to use.
Its a bit complex, so you might also want to check out how the calendar as well to get an idea of what you do and do not need.
You should only need a single DB adapter and a single Content provider per database (not per table) to do most of the work, but you can use multiple adapters/providers if you really want to. It just makes things a bit more complicated.
一个
ContentProvider
可以为多个表提供服务,但它们应该有一定的相关性。如果您打算同步您的提供商,这将会有所不同。如果您想要单独同步联系人、邮件或日历,则每个人都需要不同的提供程序,即使它们最终位于同一数据库中或与同一服务同步,因为同步适配器直接绑定到特定的提供商。据我所知,每个数据库只能使用一个 SQLiteOpenHelper,因为它将其元信息存储在数据库内的表中。因此,如果您的
ContentProviders
访问同一个数据库,您就必须以某种方式共享 Helper。One
ContentProvider
can serve multiple tables, but they should be somewhat related. It will make a difference if you intend to sync your providers. If you want seperate syncs for, let's say Contacts, Mail or Calendar, you will need different providers for each of them, even if they end up being in the same database or are synced with the same service, because Sync Adapters are tied directly to a particular provider.As far as I can tell, you can only use a single SQLiteOpenHelper per database, though, since it stores its meta information in a table within the database. So if your
ContentProviders
access the same database, you'll have to share the Helper somewhow.注意:这是对 Opy 提供的答案的澄清/修改。
此方法使用 switch 语句细分每个
insert
、delete
、update
和getType
方法,以便处理您的每张桌子。您将使用 CASE 来标识要引用的每个表(或 uri)。然后,每个 CASE 都会映射到您的一个表或 URI。例如,在案例#1 中为您的应用使用的所有表选择TABLE1 或URI1。下面是该方法的一个示例。这是针对插入方法的。它的实现方式与 Opy 略有不同,但执行相同的功能。您可以选择您喜欢的风格。我还想确保即使表插入失败,插入也会返回一个值。在这种情况下,它会返回
-1
。Note: This is a clarification/modification to the answer provide by Opy.
This approach subdivides each of the
insert
,delete
,update
, andgetType
methods with switch statements in order to handle each of your individual tables. You'll use a CASE to identify each table (or uri) to be referenced. Each CASE then maps to one of your tables or URI's. E.g., TABLE1 or URI1 is selected in CASE #1, etc. for all the tables your app employs.Here's an example of the approach. This is for the insert method. It's implemented a bit differently from Opy's but performs the same function. You can select the style you prefer. I also wanted to be sure insert returns a value even if the table insertion fails. In that case it returns a
-1
.我找到了 ContentProvider 的最佳演示和解释,我认为它遵循了 Android 标准。
合同类
和内部类:
现在使用SQLiteOpenHelper创建数据库:
内容提供者:
我希望它会对您有所帮助。
GitHub 上的演示:https://github.com/androidessence/MovieDatabase
完整文章:https://guides.codepath.com/android/creating-内容提供者
参考:
http://code.tutsplus.com/tutorials/android-sdk_content-providers--mobile-5549
http://developer.android.com/guide/topics/providers/content-providers.html
https://thenewcircle.com/ s/post/1375/android_content_provider_tutorial
http: //www.grokkingandroid.com/android-tutorial-content-provider-basics/
http://androidessence.com/
注意:我复制代码只是因为演示或文章的链接将来可能会被删除。
I found best demo and explanation for ContentProvider and I think it has followed Android Standards.
Contract Classes
and Inner Classes:
Now creating Database using SQLiteOpenHelper:
Content Provider:
I hope it will helps you.
Demo on GitHub: https://github.com/androidessence/MovieDatabase
Full Article : https://guides.codepath.com/android/creating-content-providers
References:
http://code.tutsplus.com/tutorials/android-sdk_content-providers--mobile-5549
http://www.grokkingandroid.com/android-tutorial-writing-your-own-content-provider/
http://developer.android.com/guide/topics/providers/content-providers.html
https://thenewcircle.com/s/post/1375/android_content_provider_tutorial
http://www.grokkingandroid.com/android-tutorial-content-provider-basics/
http://androidessence.com/
Note : I copied code just because if link of demo or article may be remove in future.