【问题标题】:insert into sqlite from intentservice using sqlitecursorloader使用 sqlitecursorloader 从 intentservice 插入到 sqlite
【发布时间】:2014-03-21 13:19:40
【问题描述】:

我正在使用 commonsware 中的 sqlitecursorloader 库。我在 Intentservice 中收到 GCM 消息,并想在 sqlite 数据库中插入一个条目。如果应用程序打开,它应该更新列表视图。

我尝试在初始化加载器的活动中使用它:

public static void createDbEntry(String Title, String Message) {
    ContentValues values=new ContentValues(2);

    values.put(DatabaseHelper.TITLE, Title);
    values.put(DatabaseHelper.MESSAGE, Message);

    loader.insert("constants", DatabaseHelper.TITLE, values);
  }

intentservice 中的这个:

MainActivity.createDbEntry(title,message);

据我所知,这在大多数情况下都有效,但如果加载器被回收,我会得到一个空指针。

我应该在意图服务中初始化一个新的加载器吗?

请帮忙,我是android开发的新手。

【问题讨论】:

  • cursorloaders 用于加载列表视图,而不是用于加载数据库。你可以在异步任务中插入。

标签: android sqlite intentservice commonsware-cwac


【解决方案1】:

Loader 放在静态数据成员中是不好的,对于任何Loader,更不用说SQLiteCursorLoader,因为你会泄露你的Activity

我现在也正式停止SQLiteCursorLoader

要么:

  • 切换到使用ContentProvider 和常规CursorLoader,或者

  • 使用事件总线(LocalBroadcastManager、Square 的 Otto、greenrobot 的 EventBus 等)让您的服务通知您的 UI 层根据您的更改自行刷新

【讨论】:

  • 感谢您的回复。因此,如果我理解正确,我应该只将条目添加到 sqlite db 而不是加载器中,然后通知 ui 线程在其打开时进行更新(如果不忽略)
  • @Lorof:我将其表述为“通知 UI”,而不是“通知 ui 线程”。并确保无论您如何执行此操作,都不会泄露活动或片段,例如将它们设为static。我建议的两种替代方案,如果实施得当,都不会导致泄漏。
  • 如何使用DatabaseHelper类直接插入数据库?
  • @Lorof:调用getWriteableDatabase() 并使用insert()execSQL()
猜你喜欢
  • 1970-01-01
  • 2014-03-17
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
相关资源
最近更新 更多