Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从活动、异步和服务访问SQLite_Android_Sqlite_Android Asynctask_Android Service - Fatal编程技术网

Android 从活动、异步和服务访问SQLite

Android 从活动、异步和服务访问SQLite,android,sqlite,android-asynctask,android-service,Android,Sqlite,Android Asynctask,Android Service,我正在从收件箱中读取前100条短信,并将其存储在本地数据库中。我是在AsyncTask的帮助下完成这项任务的。之后,我从本地数据库中读取这些短信并显示出来。在读取并存储前100条短消息后的onPostExecute中,我调用服务读取剩余的短消息并将其存储在本地数据库中。在调用服务之前,UI是有响应的,但在调用服务之后,UI变得没有响应。是由于数据库锁定还是其他原因。请帮助解决这个问题 我的异步任务代码 private class InitialSetup extends AsyncTask<

我正在从收件箱中读取前100条短信,并将其存储在本地数据库中。我是在AsyncTask的帮助下完成这项任务的。之后,我从本地数据库中读取这些短信并显示出来。在读取并存储前100条短消息后的onPostExecute中,我调用服务读取剩余的短消息并将其存储在本地数据库中。在调用服务之前,UI是有响应的,但在调用服务之后,UI变得没有响应。是由于数据库锁定还是其他原因。请帮助解决这个问题

我的异步任务代码

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);
    }
}
私有类InitialSetup扩展了异步任务{
@凌驾
受保护的长doInBackground(字符串…URL){
fetchSMS();
updateDatabase();
返回0升;
}
@凌驾
受保护的void onPostExecute(长结果){
if(this.dialog.isShowing()){
this.dialog.disclose();
}
populateUI(getApplicationContext());
Intent Intent=新的Intent(getApplicationContext(),SMSService.class);
getApplication().startService(意图);
}
}
服务代码

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();
    }
}
公共类SMSService扩展服务{
长inboxSMSID,localSMSID;
@凌驾
公共IBinder onBind(意图arg0){
返回null;
}
@凌驾
公共无效启动(Intent Intent,int startid){
if(intent.hasExtra(“InboxSMS”)&intent.hasExtra(“SMSID”)){
inboxSMSID=intent.getLongExtra(“InboxSMS”,0);
localSMSID=intent.getLongExtra(“SMSID”,0);
globalToLocalSMSDB(inboxSMSID);
}
}
专用void globaltolocalsMSSDB(长id){
SMSTable smsObj=新SMSTable(getApplicationContext());
smsObj.open();
Uri Uri=Uri.parse(“content://sms/inbox");
游标smscur=getContentResolver().query(URI,null,
“_id<”+id,空,“_iddesc”);
while(smscur.moveToNext()){
String sender=smsmsmanagement.getSender(smscur);
String message=smsmsmanagement.getMessage(smscur);
字符串timeStamp=smsmsmanagement.getTime(smscur);
smsObj.insertintosmtable(发送方、消息、时间戳);
}
smscur.close();
smsObj.close();
}
}

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

这取决于您在服务中所做的工作。将其代码粘贴到您是否正在创建SQLiteOpenHelper的多个实例?试着使用单例模式-或者自己同步,或者在db上启用线程安全。看看为什么你不能从asyntask访问剩余的sms,为什么你需要服务。。。如果您正在使用,请释放数据连接和内容解析程序,并在服务中重新创建它,或者在应用程序运行时向我显示您的日志unresponsive@VipinSahu我也尝试过使用异步。它仍然是最重要的same@Jens你能进一步解释一下吗?。您还可以给我任何链接,显示我在doInBackground()中尝试调用的SQLite(如果可能的话,多个表)中使用的singleton模式,但UI再次变得无响应。。。不管你如何调用一个服务,新的线程必须在它里面创建(即在onStartCommand中)。嘿,没有你的服务代码,很难判断真正的问题是什么。。。但是,如果您面临数据锁定问题,那么当您启动服务时,该链接必须尝试调试代码,并且您的服务正在启动,或者可能存在上下文问题……您显然是在UI线程中运行所有代码。您需要在服务中显式启动一个线程,或者使用IMO完全适合您需要的IntentService。