当前位置: 首页 > 知识库问答 >
问题:

IntentService在数据插入SQLite后停止,并在第二次插入时给出NULLPOINTER异常

潘智刚
2023-03-14

我正在开发一个应用程序,当没有移动信号覆盖区域时,将数据保存到数据库中。当服务返回时,它将从数据库中获取所有数据并上传到服务器上。

现在我有两个问题。

  1. IntentService在第一次将数据插入数据库时停止。(当网络服务回来时,它还上传服务器上的数据,用于检查网络连接我使用定时器。(我不想停止服务。
  2. 当第二次我再次启动它创建的服务,并给出Nullpointerest xception.因为数据库中没有数据,所以它也给出了一些其他的错误太关于数据检索.

我的代码怎么了?我只希望当用户启动服务时,它会一直运行到数据库中的最后一个数据,然后停止。我在intentservice中使用了线程,因为之前我的应用程序崩溃了。

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

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);
    }

}

离线数据服务。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而不是OnHandleContent,还是需要使用service而不是IntentService来控制它们?

共有1个答案

融唯
2023-03-14

这可能是问题所在,我看不出你在哪里保存可读数据库。。。改变这一点:

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

对此:

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

加法

对于SQLiteOpenHelper,只有在创建新数据库而不仅仅是打开现有数据库时才会调用oncreate()...将构造函数更改为:

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

(并从onCreate()中删除sqLiteDatabase=db

而且,我忘了这是一个由两部分组成的问题。IntentService不是设计为无限期运行的,您应该改用服务(或者改用ContentProvider)。

 类似资料:
  • 问题内容: 我正在寻找一种刷新页面时停止在数据库中插入或发送数据的方法。 这是我的代码: user_details_page.php Confirm_page.php 因此,每次我刷新确认page.php时,都会将数据发送到数据库。如何停止呢? 问题答案: 将用户带到新页面: 通过这样做,刷新的用户将得到刷新,这意味着它将不会重复执行两次插入操作。 最好的建议 :如果没有,请检查用户是否首先存在!

  • 另一个使用另一个bank和tbm的类,我尝试了另一个bank的PersistenceContext。

  • 问题内容: 我正在尝试在SQLite(最新版本)表中插入多行,但抛出错误 从这里得到的想法,这是我的SQL查询: 但它抛出 这是我的表结构 我的查询有问题吗? 任何帮助,将不胜感激。 TIA 问题答案: 由于提到了最新版本的SQLite,因此应使用多值插入(自3.7.11版以来受SQLite支持),如下所示: 这是更短,更快,更不容易出错的方法。其他一些数据库(至少MySQL和PostgreSQL

  • 我正在使用elasticsearch 5.6.13版本,我需要一些专家为elasticsearch配置。我在同一个系统中有3个节点(node1、node2、node3),其中node1是主节点,其他2个是数据节点。我有大约40个索引,我用默认的5个主碎片创建了所有这些索引,其中一些有2个副本。我现在面临的问题是,我的数据(抓取)正在日益增长,我的索引中有400GB的数据。类似地,其他3个索引也非常

  • 问题内容: 在MySQL中,您可以像这样插入多行: 但是,尝试执行此类操作时出现错误。是否可以一次在SQLite数据库中插入多行?这样做的语法是什么? 问题答案: 更新 正如BrianCampbell在此处指出的那样,SQLite 3.7.11及更高版本现在支持原始文章的更简单语法 。但是,如果您希望在旧数据库之间实现最大兼容性,则所示的方法仍然适用。 原始答案 如果有特权,River的回答:您可