Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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
Java 使用SQL Helper Android Eclipse打开连接时出现SQL异常错误_Java_Android_Sqlite - Fatal编程技术网

Java 使用SQL Helper Android Eclipse打开连接时出现SQL异常错误

Java 使用SQL Helper Android Eclipse打开连接时出现SQL异常错误,java,android,sqlite,Java,Android,Sqlite,我在使用eclipse进行android应用程序的数据库连接时遇到了严重的问题 我有一个这样的工作示例,但是自从我修改它之后,我就无法打开数据库连接 我有一个在异步任务中打开“getData”的主活动 这将下载一个JOSN格式的文档,解析并传递给“writeSync”类 此类用于打开数据库连接并添加记录,然后关闭连接 运行database.open方法时收到错误,但无法捕获特定错误 我已经检查了我没有传递Null值,并且Helper对象已填充 如果有人能发现我的问题,这是我的代码 我还编写了一个

我在使用eclipse进行android应用程序的数据库连接时遇到了严重的问题

我有一个这样的工作示例,但是自从我修改它之后,我就无法打开数据库连接

我有一个在异步任务中打开“getData”的主活动

这将下载一个JOSN格式的文档,解析并传递给“writeSync”类

此类用于打开数据库连接并添加记录,然后关闭连接

运行database.open方法时收到错误,但无法捕获特定错误

我已经检查了我没有传递Null值,并且Helper对象已填充

如果有人能发现我的问题,这是我的代码

我还编写了一个包装器类,用于在数据库打开时传递上下文

主要活动

package com.example.jsondb;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;

public class MainActivity extends Activity {
public Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    getContext contextrequest = new getContext();

    AsyncTask<String, Void, String> JSONData;
    //Get JSON Data as a string
    //Update display#
    //SyncDataProducts();
    JSONData = new GetData().execute("null");

    String WriteDB = "";
    //pass JSONData to database to be written
    //update display

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}
数据源

package com.example.jsondb;

import android.content.ContentValues;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;

public class DataSource {
  private SQLiteDatabase database;
  private MySQLiteHelper dbHelper;
  private String[] allColumns_products = { MySQLiteHelper.COLUMN_ID,
            MySQLiteHelper.COLUMN_STOCKREF,MySQLiteHelper.COLUMN_TITLE,MySQLiteHelper.COLUMN_PRICE};

  public DataSource(Context context) {
       dbHelper = new MySQLiteHelper(context);
      }

  public void open() throws SQLException {
        database = dbHelper.getWritableDatabase();
      }

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

  public String createProduct(String strStockRef, String strTitle, String strPrice)   {
        ContentValues values = new ContentValues();
        values.put(MySQLiteHelper.COLUMN_STOCKREF, strStockRef);
        values.put(MySQLiteHelper.COLUMN_TITLE, strTitle);
        values.put(MySQLiteHelper.COLUMN_PRICE, strPrice);


        long insertId = database.insert(MySQLiteHelper.TABLE_NAME, null,
            values);

        return "Completed";
      }

}
GETCONTEXT

package com.example.jsondb;

import android.content.Context;

public class getContext extends android.app.Application {

private static getContext instance;

public getContext() {
    instance = this;
}

 public static Context getContextNow() {
    return instance;
}

}
这是我的堆栈跟踪

05-01 15:21:22.948: E/AndroidRuntime(24214): FATAL EXCEPTION: AsyncTask #2
05-01 15:21:22.948: E/AndroidRuntime(24214): java.lang.RuntimeException: An error  occured while executing doInBackground()
05-01 15:21:22.948: E/AndroidRuntime(24214):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at java.util.concurrent.FutureTask.run(FutureTask.java:239)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at java.lang.Thread.run(Thread.java:856)
05-01 15:21:22.948: E/AndroidRuntime(24214): Caused by: java.lang.NullPointerException
05-01 15:21:22.948: E/AndroidRuntime(24214):    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:236)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at com.example.jsondb.DataSource.open(DataSource.java:19)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at com.example.jsondb.WriteSync.WriteSyncData(WriteSync.java:24)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at com.example.jsondb.WriteSync.doInBackground(WriteSync.java:51)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at com.example.jsondb.WriteSync.doInBackground(WriteSync.java:1)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
05-01 15:21:22.948: E/AndroidRuntime(24214):    ... 4 more

我已经查看了
ContextWrapper
(引发空指针异常的Android框架类)的源代码,您提供给
SQLiteOpenHelper
Context
似乎是
null
。您请求
Context
(使用“getContext”类-请以大写开头)的方式对我来说似乎很尴尬。如果没有可用的
getContext()
方法,我通常会传递指向我的活动的“this”指针。在调用
getReadableDatabase()
getWritableDatabase()
之前,您不会注意到此错误,因为
SQLiteOpenHelper
在此之前不会使用给定的
上下文


旁白:目前,您的代码跟踪还从后台线程调用
AsyncTask.execute()
(具体来说,当您在
GetData.doInBackground()
中调用
WriteSync
上的
execute()
时。根据文档,这是不允许的。您应该始终调用
AsyncTask.execute())
来自主线程。我从经验中知道,尽管从另一个线程调用execute()在大多数情况下都是正确的,但它肯定不会总是正确的。再说一遍:这与您的问题无关(这只是传递给
SQLiteOpenHelper的空上下文
),但我会在您进行此操作时查看它。

您应该使用与异步任务相关的活动、BordCasterReceiver或服务的上下文。在您的情况下,请使用MainActivity上下文:

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
   ...
   JSONData = new GetData(this.getContext()).execute("null");


public class GetData extends AsyncTask<String, Void, String> {
  Context context = null
  public GetData(Context context) {
    this.context=context;
公共类MainActivity扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
...
JSONData=newgetdata(this.getContext()).execute(“null”);
公共类GetData扩展异步任务{
上下文=空
公共GetData(上下文){
this.context=context;

我已经在上面添加了我的股票跟踪。谢谢你,巴斯克。这是一个很大的帮助。我已经修改了getcontext,因此它从主要活动中选择了上下文。我再次接受关于线程的评论。Thabks
package com.example.jsondb;

import android.content.Context;

public class getContext extends android.app.Application {

private static getContext instance;

public getContext() {
    instance = this;
}

 public static Context getContextNow() {
    return instance;
}

}
05-01 15:21:22.948: E/AndroidRuntime(24214): FATAL EXCEPTION: AsyncTask #2
05-01 15:21:22.948: E/AndroidRuntime(24214): java.lang.RuntimeException: An error  occured while executing doInBackground()
05-01 15:21:22.948: E/AndroidRuntime(24214):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at java.util.concurrent.FutureTask.run(FutureTask.java:239)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at java.lang.Thread.run(Thread.java:856)
05-01 15:21:22.948: E/AndroidRuntime(24214): Caused by: java.lang.NullPointerException
05-01 15:21:22.948: E/AndroidRuntime(24214):    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:236)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at com.example.jsondb.DataSource.open(DataSource.java:19)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at com.example.jsondb.WriteSync.WriteSyncData(WriteSync.java:24)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at com.example.jsondb.WriteSync.doInBackground(WriteSync.java:51)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at com.example.jsondb.WriteSync.doInBackground(WriteSync.java:1)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
05-01 15:21:22.948: E/AndroidRuntime(24214):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
05-01 15:21:22.948: E/AndroidRuntime(24214):    ... 4 more
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
   ...
   JSONData = new GetData(this.getContext()).execute("null");


public class GetData extends AsyncTask<String, Void, String> {
  Context context = null
  public GetData(Context context) {
    this.context=context;