【问题标题】:Accessing SQLite from Activity, Async and Service从 Activity、Async 和 Service 访问 SQLite
【发布时间】:2012-04-20 08:24:58
【问题描述】:

我正在从收件箱中读取前 100 条短信并将其存储在本地数据库中。我在 AsyncTask 的帮助下做到了这一点。之后,我正在从本地数据库中读取这些 SMS 并显示它。在读取和存储前 100 条短信后,在 AysncTask 的 onPostExecute 中,我正在调用该服务来读取剩余的短信并将其存储在本地数据库中。在调用服务之前,UI 是响应式的,但在调用服务后,UI 变得无响应。是由于数据库锁定还是其他原因。请帮忙解决这个问题...

我的 AsyncTask 代码

private class InitialSetup extends AsyncTask<String, Integer, Long> {
    @Override
    protected Long doInBackground(String... urls) {
        fetchSMS();
        updateDatabase();
        return 0L;
    }

    @Override
    protected void onPostExecute(Long result) {
        if (this.dialog.isShowing()) {
            this.dialog.dismiss();
        }
        populateUI(getApplicationContext());
        Intent intent = new Intent(getApplicationContext(), SMSService.class);
        getApplication().startService(intent);
    }
}

服务代码

public class SMSService extends Service {

    Long inboxSMSID, localSMSID;

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public void onStart(Intent intent, int startid) {
        if (intent.hasExtra("InboxSMS") && intent.hasExtra("SMSID")) {
            inboxSMSID = intent.getLongExtra("InboxSMS", 0);
            localSMSID = intent.getLongExtra("SMSID", 0);
            globalToLocalSMSDB(inboxSMSID);
        }
    }

    private void globalToLocalSMSDB(Long id) {
        SMSTable smsObj = new SMSTable(getApplicationContext());
        smsObj.open();
        Uri uriSMSURI = Uri.parse("content://sms/inbox");
        Cursor smscur = getContentResolver().query(uriSMSURI, null,
                "_id < " + id, null, "_id DESC");
        while (smscur.moveToNext()) {
            String sender = SMSManagement.getSender(smscur);
            String message = SMSManagement.getMessage(smscur);
            String timeStamp = SMSManagement.getTime(smscur);
            smsObj.insertIntoSMSTable(sender, message, timeStamp);
        }
        smscur.close();
        smsObj.close();
    }
}

【问题讨论】:

  • 这取决于您在服务中所做的工作。也粘贴它的代码
  • 您是否正在创建 SQLiteOpenHelper 的 几个 实例?尝试使用单例模式 - 自己同步或在数据库上启用线程安全。
  • 看看你为什么不从 asyntask 访问剩余的短信,为什么你需要服务......如果你正在使用,请释放数据连接和内容解析器并在服务中重新创建它或向我展示你的当您的应用无响应时的 logcat
  • @VipinSahu 我也尝试过使用异步。它仍然保持不变
  • @Jens 你能进一步解释一下吗?你也可以给我任何链接,显示在 SQLite 方面单例模式的用法(如果可能的话,使用多个表)

标签: android sqlite android-asynctask android-service


【解决方案1】:

该服务也在 UI 线程中运行,除非它是 IntentService,否则您必须在那里手动创建工作线程。

【讨论】:

  • 我尝试在 doInBackground() 中调用,但 UI 再次变得无响应
  • nono...无论您如何调用服务,都必须在其中创建新线程(即在 onStartCommand 中)
  • 嘿,如果没有您的服务代码,很难说出真正的问题是什么......但如果遇到数据锁定问题,只需使用此链接google.co.in/…
  • 必须在您启动服务时尝试调试代码并且您的服务是否正在启动或可能存在上下文问题......
  • 您显然是在 UI 线程中运行所有代码。您需要在服务中显式启动一个线程或使用 IMO 完全适合您需要的 IntentService。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 2017-04-14
  • 1970-01-01
相关资源
最近更新 更多