IntentService停止数据插入的SQLite后有机会获得空指针异常时,插入第2次 [英] IntentService Stops After Data Insertion into SQLite and Gives NULLPOINTER EXCEPTION when insert 2nd time

查看:261
本文介绍了IntentService停止数据插入的SQLite后有机会获得空指针异常时,插入第2次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发中,当有移动信号覆盖的任何区域中的数据保存到数据库的应用程序。当服务回来它就会从数据库中获取的所有数据并上传服务器。

I'm developing an app in which data saved into database when there is no covered area of mobile signals. When service came back it will fetch all data from database and upload on server.

现在我有两个问题。


  1. IntentService时第1次的数据插入到数据库停止。(当网络服务回来还上传服务器上的数据,用于检查网络连接我用定时器)。我不想停止服务。

  2. 当第二次,我开始再次创建并给出NullPointerException异常的服务。因为在数据库中没有数据,所以这也给了一些其他错误太多有关数据retrivel。

请告诉我错在我的code?我只是想,当用户启动该服务将运行到数据库中的最后一个数据之后,它就会停止。我使用的线程在intentservice因为早期我的应用程序崩溃。

Whats wrong in my code? I just want that when user starts the service it will run till last data in database and after that it will stop. I used threads in intentservice because earlier my app crash.

LogCat中错误

10-14 20:44:02.135: E/Service(10042): Service Created.. 
10-14 20:44:02.505: E/Service Started(10042): Successful
10-14 20:44:03.585: E/Service Network(10042): Network is offline
10-14 20:44:08.656: E/Service Network(10042): Network is offline
10-14 20:44:13.616: E/Service Network(10042): Network is offline
10-14 20:44:18.646: E/Service Network(10042): Network is offline
10-14 20:44:23.595: E/Service Network(10042): Network is offline
10-14 20:44:29.526: E/Service Network(10042): Network is online
10-14 20:44:31.256: E/Data Sent(10042): Response 200
10-14 20:44:33.599: E/Service Network(10042): Network is online
10-14 20:44:34.446: E/Data Sent(10042): Response 200
10-14 20:44:38.646: E/Service Network(10042): Network is online
10-14 20:44:40.616: E/Data Sent(10042): Response 200
10-14 20:44:43.625: E/Service Network(10042): Network is offline
10-14 20:44:48.595: E/Service Network(10042): Network is offline
10-14 20:44:53.586: E/Service Network(10042): Network is offline
10-14 20:45:20.486: E/Service(10042): Service Created.. 
10-14 20:45:20.587: E/Service Started(10042): Successful
10-14 20:45:20.627: E/Insertion(10042): java.lang.NullPointerException
10-14 20:45:21.666: E/Service Network(10042): Network is offline
10-14 20:45:23.616: E/Service Network(10042): Network is offline
10-14 20:45:36.645: E/Service Network(10042): Network is offline
10-14 20:45:38.585: E/Service Network(10042): Network is offline
10-14 20:45:41.786: E/Service Network(10042): Network is online
10-14 20:45:42.026: E/AndroidRuntime(10042): FATAL EXCEPTION: Timer-1
10-14 20:45:42.026: E/AndroidRuntime(10042): java.lang.NullPointerException
10-14 20:45:42.026: E/AndroidRuntime(10042):    at com.remote.synchronizer.haris.SQLiteAdapter.getAllContacts(SQLiteAdapter.java:93)
10-14 20:45:42.026: E/AndroidRuntime(10042):    at com.remote.synchronizer.haris.OfflineDataService$1$1.run(OfflineDataService.java:80)
10-14 20:45:42.026: E/AndroidRuntime(10042):    at java.util.Timer$TimerImpl.run(Timer.java:284)
10-14 20:45:43.646: E/Service Network(10042): Network is online
10-14 20:45:44.266: E/Data Sent(10042): Response 200

SQLiteAdapter.java

SQLiteAdapter.java

package com.remote.synchronizer.haris;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class SQLiteAdapter extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "Product";
    public static final String TABLE_NAME = "Orders";
    public static final int DATABASE_VERSION = 1;
    public static final String KEY_ID = " _id";  //
    public static final String KEY_NAME = "name";
    public static final String KEY_SHOP = "shop";
    private static final String KEY_CITY = "city";
    private static final String KEY_DATE = "datee";
    private static final String KEY_ORDER = "orderr";

    private SQLiteDatabase sqLiteDatabase;
    private SQLiteAdapter sqLiteHelper=this;

    private static final String CREATE_TABLE =
            "CREATE TABLE " + TABLE_NAME + " ("
                    + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                    + KEY_NAME + " VARCHAR,"
                    + KEY_SHOP + " VARCHAR," + KEY_CITY + " VARCHAR, " + KEY_DATE + " VARCHAR, " + KEY_ORDER + " VARCHAR" +");";


    public SQLiteAdapter(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);  
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE);
        sqLiteDatabase=db;
    }

    /*public void close(){
        sqLiteHelper.close();
    }
     */
    public void insert(String name, String shop, String city, String datee, String orderr){

        try
        {
            ContentValues contentValues = new ContentValues();
            contentValues.put(KEY_NAME, name);
            contentValues.put(KEY_SHOP, shop);
            contentValues.put(KEY_CITY, city);
            contentValues.put(KEY_DATE, datee);
            contentValues.put(KEY_ORDER, orderr);
            sqLiteDatabase.insertOrThrow(TABLE_NAME, KEY_ID, contentValues);
            //sqLiteDatabase.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
            Log.e("Insertion", e.toString());
        }
    }

    public void deleteAll(){
        sqLiteDatabase.delete(TABLE_NAME, null, null);
    }

    public void delete_byID(int id){
        sqLiteDatabase.delete(TABLE_NAME, KEY_ID+"="+id, null);
    }

    /*public Cursor queueAll(){
        String[] columns = new String[]{KEY_ID, KEY_NAME, KEY_SHOP, KEY_CITY,  KEY_DATE, KEY_ORDER};
        Cursor cursor = sqLiteDatabase.query(TABLE_NAME, columns, 
                null, null, null, null, null);

        return cursor;
    }*/

    public List<NameValuePair> getAllContacts() {
        List<NameValuePair> postParameters = new ArrayList<NameValuePair>();

        String selectQuery = "SELECT  * FROM " + TABLE_NAME;
        sqLiteHelper.getReadableDatabase();
        Cursor cursor = sqLiteDatabase.rawQuery(selectQuery, null);

        if(cursor.moveToFirst()){
            while(!cursor.isAfterLast())
            {
                postParameters.add(new BasicNameValuePair("User", cursor.getString(cursor.getColumnIndex(KEY_NAME))));
                postParameters.add(new BasicNameValuePair("ShopName", cursor.getString(cursor.getColumnIndex(KEY_SHOP))));
                postParameters.add(new BasicNameValuePair("city", cursor.getString(cursor.getColumnIndex(KEY_CITY))));
                postParameters.add(new BasicNameValuePair("OrderDate", cursor.getString(cursor.getColumnIndex(KEY_DATE))));
                postParameters.add(new BasicNameValuePair("OrderDetail", cursor.getString(cursor.getColumnIndex(KEY_ORDER))));
                cursor.moveToNext();
            }

        }
        //cursor.close();
        return postParameters;
    };

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w(SQLiteAdapter.class.getName(),
                "Upgrading database from version " + oldVersion + " to "
                        + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS " + CREATE_TABLE);
        onCreate(db);
    }

}

OfflineDataService.java

OfflineDataService.java

package com.remote.synchronizer.haris;

import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import org.apache.http.NameValuePair;

import android.app.IntentService;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Log;

public class OfflineDataService extends IntentService {

    boolean wifi,edge;
    private Timer timer= new Timer();
    SQLiteDatabase db;
    String un,shop,city,date,order;
    private SQLiteAdapter mySQLiteAdapter;
    Cursor cursor;

    public OfflineDataService() {
        super("OfflineDataService");
    }

    @Override   
    public void onCreate() {

        super.onCreate();

        Log.e("Service", "Service Created.. ");

        mySQLiteAdapter = new SQLiteAdapter(this);
        mySQLiteAdapter.getWritableDatabase();

    }   

    @Override
    protected void onHandleIntent(final Intent intent) {

        final Handler threadHandler;  
        threadHandler = new Handler();

        new Thread(new Runnable(){

            @Override
            public void run() {

                Bundle bundle=intent.getExtras();
                un=bundle.getString("un");
                shop=bundle.getString("shop");
                city=bundle.getString("city");
                date=bundle.getString("date");
                order=bundle.getString("order");

                Log.e("Service Started", "Successful");

                //Inserting New Record
                mySQLiteAdapter.insert(un,shop,city,date,order);

                timer.scheduleAtFixedRate(new TimerTask(){

                    @Override
                    public void run() {

                        //Checking network connectivity
                        wifi=NetworkInfo.Wifi(OfflineDataService.this);
                        edge=NetworkInfo.EDGE(OfflineDataService.this);

                        if(wifi==true||edge==true)
                        {
                            Log.e("Service Network", "Network is online");
                            List<NameValuePair> contacts=new ArrayList<NameValuePair>();

                            contacts=mySQLiteAdapter.getAllContacts();

                            String url="http://10.0.2.2:3325/Product/Create?"; 

                            int response = 0;

                            try 
                            {
                                response = CustomHttpClient.executeHttpPost(url, contacts);

                                if(response==200)
                                {
                                    Log.e("Data Sent", "Response 200");
                                }

                                else{

                                    Log.e("Service Data", "Faield to upload data" );
                                }

                            }
                            catch (Exception e)
                            {
                                Log.e("Data Sending", e.toString());
                                e.printStackTrace();
                            }
                        }
                        else
                        {
                            Log.e("Service Network", "Network is offline");
                        }
                    }

                }, 1000, 5000);

            }

        }).start();
    }

    /*@Override
    public void onDestroy() {

        super.onDestroy();
      //  mySQLiteAdapter.deleteAll();
        Log.e("Service Destroy", "Successful");


    }*/
}

我是否需要使用onStartCommand代替onHandleIntent或做我需要使用的服务,而不是IntentService来控制它们?

Do I need to use onStartCommand instead of onHandleIntent or do I need to use service instead of IntentService to control them?

推荐答案

这可能是问题,我没有看到你在哪里保存可读数据库...更改此:

This might be the problem, I don't see where you are saving the readable database... Change this:

sqLiteHelper.getReadableDatabase();
Cursor cursor = sqLiteDatabase.rawQuery(selectQuery, null);

要这样:

if(sqLiteDatabase == null || !sqLiteDatabase.isOpen()) {
    sqLiteDatabase = sqLiteHelper.getReadableDatabase();
}
Cursor cursor = sqLiteDatabase.rawQuery(selectQuery, null);


加入

对于SQLiteOpenHelper,的onCreate()仅当您创建一个名为的一个的新的的数据库不是刚刚开放现有的...你的构造函数更改为:

For a SQLiteOpenHelper, onCreate() is only called when you are creating a new database not just opening an existing one... Change your constructor to:

public SQLiteAdapter(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);  
    sqLiteDatabase = this.getWritableDatabase();
}

(并删除 sqLiteDatabase = DB 的onCreate()

另外,我忘了,这是一个问题的两个部分。 IntentServices不是用来跑下去,你应该使用,而不是服务(或改用ContentProvider的)。

Also, I forgot that this was a two part question. IntentServices are not designed to run indefinitely, you should use a Service instead (or switch to using a ContentProvider).

这篇关于IntentService停止数据插入的SQLite后有机会获得空指针异常时,插入第2次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆