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