Android 在TabActivity中实现SQLiteDatabase和AsyncTask的位置/方式

Android 在TabActivity中实现SQLiteDatabase和AsyncTask的位置/方式,android,android-asynctask,sqliteopenhelper,Android,Android Asynctask,Sqliteopenhelper,我基本上完成了我正在开发的一个应用程序(我的第一个!),除了实现任何数据保存机制。不久前,我研究了这些选项,认为SQLiteDatabase是最好的选择,但很难完全理解如何实现它,所以我将其保留到完成程序的其余部分。从那以后,我一直在测试它,每次在我的设备上运行它时,我都会重新输入所有的值 应用程序一开始屏幕上基本上什么都没有。用户添加播放器(通过菜单和对话框)。玩家列表完成后,用户单击对话框中的“保存”。然后,每个玩家的表行会动态膨胀,包括一个按钮、几个ImageView和一个TextView

我基本上完成了我正在开发的一个应用程序(我的第一个!),除了实现任何数据保存机制。不久前,我研究了这些选项,认为SQLiteDatabase是最好的选择,但很难完全理解如何实现它,所以我将其保留到完成程序的其余部分。从那以后,我一直在测试它,每次在我的设备上运行它时,我都会重新输入所有的值

应用程序一开始屏幕上基本上什么都没有。用户添加播放器(通过菜单和对话框)。玩家列表完成后,用户单击对话框中的“保存”。然后,每个玩家的表行会动态膨胀,包括一个按钮、几个ImageView和一个TextView,所有这些都会显示每个玩家的各种属性。这对我的问题并不重要

所以,我的应用程序基本上只会跟踪玩家对象。我的数据库对象都是以这个为指导构建的:,大部分情况下,将“联系人”替换为“玩家”

我很难理解的是,在何处实现每个player对象的“保存”和“加载”,以及在主活动的onCreate、onResume和onStop方法中执行哪些操作。我已经研究了好几个小时了,我知道我也应该实现一个异步任务,但这更复杂,我甚至无法将基本数据加载到我的大脑中,更不用说异步执行了

在Deitel Developer系列中,我正在读一本名为《程序员的Android:应用驱动方法》的书,其中有一个很好的例子,介绍了如何实现AsyncTask和SQLiteDatabase,但在他们的例子中,他们在ListActivity中使用了游标适配器,所以我不知道如何使其适用于我的情况。(我的是TabActivity,我上面解释的只是“查看玩家”选项卡。)

当用户单击“添加玩家对话框”中的“保存”时,将玩家添加到数据库对我来说是有意义的,但我不知道在哪里重新加载玩家对象以及在哪里重新调整每个玩家的表行


很抱歉,我没有发布更精确的代码,但这是一个更一般的问题,我不想发布我的整个应用程序,因为它大约有1000行长。任何帮助都将不胜感激,我尽量不在这里张贴每一件小事,但这件事让我沮丧太久了

AsyncTasks在配置更改(如手机的旋转)时非常痛苦,而且很容易造成内存泄漏。你应该使用加载器。不要介意它的名字,它也可以用来写数据——基本上是在后台完成的每个操作。更具体地说,我将使用and,在
loadInBackground()
方法中,我将放置一个数据库助手来选择或插入数据。Database helper应该是SQLiteOpenHelper的扩展,它应该只实例化一次,所以我建议将它放在应用程序上下文中,并从中获取引用


希望能有帮助。

我有和你一样的书。我使用了AddressBook应用程序(它处理数据库连接器),这对我帮助很大。现在,我可以与您共享我的代码(我已经学习了另一个Android Hive教程,通过SQL/PHP脚本进行登录/注册),然后成功地将其转换为使用ASyncTask。也就是说,我现在正在工作的部分是重新实现本地SQLite db:我需要让它存储登录用户的电子邮件等,以便我可以在屏幕上显示此信息。此外,我有一个页面,用户可以在其中提交更多信息(年龄、国籍等),然后应用程序将这些数据与其他帐户信息一起存储在SQL server上

正如我所说的,我很高兴与您分享这段代码,但它并不是您想要的,因为它是一个网络数据库,而不是本地SQLite数据库。它将有SQLite db方面,我只是还没有完成这部分


最后,我建议您从Deitel的通讯录中选择通讯录,它确实帮助了我。

您好,谢谢您的回复。我不担心手机旋转,因为它在舱单上被设置为肖像。我更担心的是把每段代码放在哪里。我知道在哪里“保存”东西,但我不知道如何在用户每次重新启动应用程序时重新加载所有内容,特别是关于onCreate()、onResume()、onStop()等。对于保存的信息、恢复状态等,这些方法我仍然不完全理解。此外,我还查看了您链接的AsyncTaskLoader文档。它说它们是在Android 3.0中引入的,所以我不能使用它们,因为我的应用程序(和手机)都是API 8+。你可以!它们在兼容包中,所以如果我记得很酷的话,你可以在API 7+中使用它们,我不知道这是一件事,哈哈。我会调查的。我仍然不知道如何重新加载所有信息。保存状态很糟糕:(重新加载信息是什么意思?如果将数据保存在SQLite中,它会在用户会话之间持续存在。您需要做的就是在中启动加载程序,例如,
onCreate()
,然后使用LoaderCallback方法(这里的示例是如何做到这一点:)AsyncTaskLoader.html从数据库加载数据。一旦你有了数据显示,它就会等待回复。你说得对,我对网络数据库不感兴趣,但是本地数据库,一旦你建立起来并运行起来,会对我有很大帮助,因为它听起来就像我正在做的事情。我的应用程序中的每个玩家对象都会记录一些事情,就像你的应用程序记录年龄、国籍等一样。我试图在我的应用程序中使用Deitel book,但他们解释的方式是“我们使用了ListView,它会自动完成所有事情,因为它是ListActivity。”因此,它对我的应用程序没有帮助。这本书在很多方面是好的,但在其他方面是坏的,就像这样。我同意。今天晚些时候,我将尝试发布更多关于我如何使用本地SQLite dB的信息,你愿意吗