android - getWritableDatabase() 错误

标签 android sqlite

我想在手机不在覆盖区域时存储一些数据。当服务恢复时,它将在服务器上上传数据。但数据没有插入。我在网上查了很多教程。但一直都一样。应用程序意外关闭。

LogCat 错误

        10-12 12:08:54.754: E/Service Example(1374): Service Started.. 
        10-12 12:08:54.814: E/AndroidRuntime(1374): FATAL EXCEPTION: main
        10-12 12:08:54.814: E/AndroidRuntime(1374): java.lang.RuntimeException: Unable    create service com.remote.synchronizer.haris.OfflineDataService:  java.lang.NullPointerException
        10-12 12:08:54.814: E/AndroidRuntime(1374):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:1955)
        10-12 12:08:54.814: E/AndroidRuntime(1374):     at android.app.ActivityThread.access$2500(ActivityThread.java:117)
        10-12 12:08:54.814: E/AndroidRuntime(1374):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:985)
        10-12 12:08:54.814: E/AndroidRuntime(1374):     at android.os.Handler.dispatchMessage(Handler.java:99)
        10-12 12:08:54.814: E/AndroidRuntime(1374):     at android.os.Looper.loop(Looper.java:123)
        10-12 12:08:54.814: E/AndroidRuntime(1374):     at android.app.ActivityThread.main(ActivityThread.java:3683)
        10-12 12:08:54.814: E/AndroidRuntime(1374):     at java.lang.reflect.Method.invokeNative(Native Method)
        10-12 12:08:54.814: E/AndroidRuntime(1374):     at java.lang.reflect.Method.invoke(Method.java:507)
        10-12 12:08:54.814: E/AndroidRuntime(1374):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
        10-12 12:08:54.814: E/AndroidRuntime(1374):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
        10-12 12:08:54.814: E/AndroidRuntime(1374):     at dalvik.system.NativeStart.main(Native Method)
        10-12 12:08:54.814: E/AndroidRuntime(1374): Caused by: java.lang.NullPointerException
        10-12 12:08:54.814: E/AndroidRuntime(1374):     at com.remote.synchronizer.haris.SQLiteAdapter.Write(SQLiteAdapter.java:59)
        10-12 12:08:54.814: E/AndroidRuntime(1374):     at com.remote.synchronizer.haris.OfflineDataService.onCreate(OfflineDataService.java:37)
        10-12 12:08:54.814: E/AndroidRuntime(1374):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:1945)
        10-12 12:08:54.814: E/AndroidRuntime(1374):     ... 10 more

SQLite 适配器

    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 = "Order";
    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 = "date";
    private static final String KEY_ORDER = "order";


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

    private SQLiteDatabase sqLiteDatabase;
    private SQLiteAdapter sqLiteHelper;

    /*private Context context;

    public SQLiteAdapter(Context c){
        context = c;
    }
    */
    public void Read() throws android.database.SQLException {
        sqLiteDatabase = sqLiteHelper.getReadableDatabase();        
    }

    public void Write() throws android.database.SQLException {
        sqLiteDatabase = sqLiteHelper.getWritableDatabase();    
    }

    public void close(){
        sqLiteHelper.close();
    }

    public long insert(String name, String shop, String city, String date, String order){

        ContentValues contentValues = new ContentValues();
        contentValues.put(KEY_NAME, name);
        contentValues.put(KEY_SHOP, shop);
        contentValues.put(KEY_SHOP, city);
        contentValues.put(KEY_DATE, date);
        contentValues.put(KEY_ORDER, order);
        return sqLiteDatabase.insert(TABLE_NAME, null, contentValues);
    }

    public int deleteAll(){
        return 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;
        Read();
        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

    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.util.Log;
    import android.widget.Toast;

    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 Example", "Service Started.. ");

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

}   

    @Override
    protected void onHandleIntent(Intent intent) {

        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)
                       {
                           DataSender();
                       }
                       else
                       {
                           //Toast toast=Toast.makeText(getApplicationContext(), "Testing", toast.LENGTH_LONG).show();
                       }
            }

        }, 1000, 5000);


    }

    /*@Override
    public void onDestroy() {

        super.onDestroy();
        Log.e("Service Example", "Service Destroyed.. ");
        mySQLiteAdapter.deleteAll();


    }*/

    private void DataSender()
    {
        timer.cancel();

        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)
                {
                    //notification
                }

                else{}
                    //error.setText("Sorry!! Try again later.\n Response Code: "+ response);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            //  error.setText(e.toString());
            }
    }

}

我的代码有什么问题?

log cat 中的新错误

10-12 14:57:00.424: E/Service Example(1494): Service Started.. 
10-12 14:57:00.664: E/Database(1494): Failure 1 (near "Order": syntax error) on 0x5b7638 when preparing 'CREATE TABLE Order (_id integer primary key autoincrement, name VARCHAR,shop VARCHAR,city VARCHAR, date VARCHAR, order VARCHAR );'.
10-12 14:57:00.764: E/AndroidRuntime(1494): FATAL EXCEPTION: main
10-12 14:57:00.764: E/AndroidRuntime(1494): java.lang.RuntimeException: Unable to create service com.remote.synchronizer.haris.OfflineDataService: android.database.sqlite.SQLiteException: near "Order": syntax error: CREATE TABLE Order (_id integer primary key autoincrement, name VARCHAR,shop VARCHAR,city VARCHAR, date VARCHAR, order VARCHAR );
10-12 14:57:00.764: E/AndroidRuntime(1494):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:1955)
10-12 14:57:00.764: E/AndroidRuntime(1494):     at android.app.ActivityThread.access$2500(ActivityThread.java:117)
10-12 14:57:00.764: E/AndroidRuntime(1494):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:985)
10-12 14:57:00.764: E/AndroidRuntime(1494):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-12 14:57:00.764: E/AndroidRuntime(1494):     at android.os.Looper.loop(Looper.java:123)
10-12 14:57:00.764: E/AndroidRuntime(1494):     at android.app.ActivityThread.main(ActivityThread.java:3683)
10-12 14:57:00.764: E/AndroidRuntime(1494):     at java.lang.reflect.Method.invokeNative(Native Method)
10-12 14:57:00.764: E/AndroidRuntime(1494):     at java.lang.reflect.Method.invoke(Method.java:507)
10-12 14:57:00.764: E/AndroidRuntime(1494):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-12 14:57:00.764: E/AndroidRuntime(1494):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-12 14:57:00.764: E/AndroidRuntime(1494):     at dalvik.system.NativeStart.main(Native Method)
10-12 14:57:00.764: E/AndroidRuntime(1494): Caused by: android.database.sqlite.SQLiteException: near "Order": syntax error: CREATE TABLE Order (_id integer primary key autoincrement, name VARCHAR,shop VARCHAR,city VARCHAR, date VARCHAR, order VARCHAR );
10-12 14:57:00.764: E/AndroidRuntime(1494):     at android.database.sqlite.SQLiteDatabase.native_execSQL(Native Method)
10-12 14:57:00.764: E/AndroidRuntime(1494):     at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1763)
10-12 14:57:00.764: E/AndroidRuntime(1494):     at com.remote.synchronizer.haris.SQLiteAdapter.onCreate(SQLiteAdapter.java:42)
10-12 14:57:00.764: E/AndroidRuntime(1494):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:126)
10-12 14:57:00.764: E/AndroidRuntime(1494):     at com.remote.synchronizer.haris.SQLiteAdapter.Write(SQLiteAdapter.java:59)
10-12 14:57:00.764: E/AndroidRuntime(1494):     at com.remote.synchronizer.haris.OfflineDataService.onCreate(OfflineDataService.java:37)
10-12 14:57:00.764: E/AndroidRuntime(1494):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:1945)
10-12 14:57:00.764: E/AndroidRuntime(1494):     ... 10 more

最佳答案

您定义了您的 sqLiteHelper 但从未对其进行初始化。这意味着当下面这一行(在您的 Write() 方法中)运行时,它会导致 logcat 中显示的 NullPointerException

sqLiteDatabase = sqLiteHelper.getWritableDatabase();

将其更改为...

sqLiteDatabase = this.getWritableDatabase();

..或确保 sqLiteHelper 在使用前已初始化。

注意:就目前而言,除非您初始化 sqLiteHelper 或我们 this,否则您的 Read() 方法将以相同的方式失败。

关于android - getWritableDatabase() 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12854558/

相关文章:

javascript - ajax 完成后清除 Phonegap 应用程序上的缓存或清除 javascript 变量

android - 如何以编程方式打开手电筒闪光灯

android - styles.xml (res\values\styles.xml) 和 styles.xml (res\values-v21\styles.xml) 之间的区别?

visual-studio-2008 - 一键部署 - 如何确保仅在 sqlite 数据库文件不存在时才复制它?

Android 事务或触发器?

mysql - SQLite执行顺序

android - 通知不适用于 Android oneplus3 手机

android - 使用 TimePicker 或 NumberPicker 查看对话框首选项时旋转 Android 设备会导致应用程序崩溃

Python sqlite3.操作错误: no such table:

java - moveToFirst的SQLite数据库函数