Android 未创建数据库
我正在尝试创建一个数据库,并对该数据库执行一些CRUD操作。当我尝试插入并选择时,出现以下错误:Android 未创建数据库,android,sqlite,Android,Sqlite,我正在尝试创建一个数据库,并对该数据库执行一些CRUD操作。当我尝试插入并选择时,出现以下错误: 07-19 08:26:21.880: E/AndroidRuntime(2740): FATAL EXCEPTION: main 07-19 08:26:21.880: E/AndroidRuntime(2740): java.lang.ClassCastException: com.example.testdb.MainActivity$Select cannot be cast to java
07-19 08:26:21.880: E/AndroidRuntime(2740): FATAL EXCEPTION: main
07-19 08:26:21.880: E/AndroidRuntime(2740): java.lang.ClassCastException: com.example.testdb.MainActivity$Select cannot be cast to java.lang.CharSequence
07-19 08:26:21.880: E/AndroidRuntime(2740): at com.example.testdb.MainActivity$2.onClick(MainActivity.java:47)
07-19 08:26:21.880: E/AndroidRuntime(2740): at android.view.View.performClick(View.java:4204)
07-19 08:26:21.880: E/AndroidRuntime(2740): at android.view.View$PerformClick.run(View.java:17355)
07-19 08:26:21.880: E/AndroidRuntime(2740): at android.os.Handler.handleCallback(Handler.java:725)
07-19 08:26:21.880: E/AndroidRuntime(2740): at android.os.Handler.dispatchMessage(Handler.java:92)
07-19 08:26:21.880: E/AndroidRuntime(2740): at android.os.Looper.loop(Looper.java:137)
07-19 08:26:21.880: E/AndroidRuntime(2740): at android.app.ActivityThread.main(ActivityThread.java:5041)
07-19 08:26:21.880: E/AndroidRuntime(2740): at java.lang.reflect.Method.invokeNative(Native Method)
07-19 08:26:21.880: E/AndroidRuntime(2740): at java.lang.reflect.Method.invoke(Method.java:511)
07-19 08:26:21.880: E/AndroidRuntime(2740): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-19 08:26:21.880: E/AndroidRuntime(2740): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-19 08:26:21.880: E/AndroidRuntime(2740): at dalvik.system.NativeStart.main(Native Method)
所以我尝试创建一个单独的项目来测试我的代码。我有两个简单的按钮,一个用来插入记录,另一个用来显示在TextView
中检索到的记录。插入工作查找,(我希望)然而,当我点击按钮检索数据时,上面的错误显示出来,应用程序崩溃
以下是我的代码:
public class MainActivity extends Activity
{
static DatabaseImplementation di;
static SQLiteDatabase db;
Button btnInsert;
Button btnShow;
TextView txtView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
di = new DatabaseImplementation(this);
db = di.getWritableDatabase();
btnInsert = (Button)findViewById(R.id.btnInsert);
btnInsert.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
new Insert().execute("");
}
});
btnShow = (Button)findViewById(R.id.btnShow);
btnShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
AsyncTask<String, Void, String> result = new Select().execute("");
txtView = (TextView)findViewById(R.id.txtView);
txtView.setText((CharSequence) result);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private static class Insert extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... params)
{
try
{
executeInsert();
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
}
private static String executeInsert()
{
return "INSERT INTO tbl_Test VALUES(1, 'Testing');";
}
private static class Select extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... params)
{
try
{
String result = executeSelect();
return result;
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
}
private static String executeSelect()
{
return "SELECT test FROM tbl_Test WHERE _id = 1;";
}
}
@西拉克
07-19 09:32:05.580:E/AndroidRuntime(9498):致命异常:主
07-19 09:32:05.580:E/AndroidRuntime(9498):java.lang.NullPointerException
07-19 09:32:05.580:E/AndroidRuntime(9498):位于android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:43)
07-19 09:32:05.580:E/AndroidRuntime(9498):位于android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:37)
07-19 09:32:05.580:E/AndroidRuntime(9498):位于android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
07-19 09:32:05.580:E/AndroidRuntime(9498):位于android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
07-19 09:32:05.580:E/AndroidRuntime(9498):位于android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253)
07-19 09:32:05.580:E/AndroidRuntime(9498):在com.example.testdb.MainActivity$Select.onPostExecute(MainActivity.java:115)
07-19 09:32:05.580:E/AndroidRuntime(9498):在com.example.testdb.MainActivity$Select.onPostExecute(MainActivity.java:1)
07-19 09:32:05.580:E/AndroidRuntime(9498):在android.os.AsyncTask.finish(AsyncTask.java:631)
07-19 09:32:05.580:E/AndroidRuntime(9498):在android.os.AsyncTask.access$600(AsyncTask.java:177)
07-19 09:32:05.580:E/AndroidRuntime(9498):位于android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
07-19 09:32:05.580:E/AndroidRuntime(9498):在android.os.Handler.dispatchMessage(Handler.java:99)上
07-19 09:32:05.580:E/AndroidRuntime(9498):在android.os.Looper.loop(Looper.java:137)上
07-19 09:32:05.580:E/AndroidRuntime(9498):位于android.app.ActivityThread.main(ActivityThread.java:5041)
07-19 09:32:05.580:E/AndroidRuntime(9498):位于java.lang.reflect.Method.Invokenactive(本机方法)
07-19 09:32:05.580:E/AndroidRuntime(9498):在java.lang.reflect.Method.invoke(Method.java:511)
07-19 09:32:05.580:E/AndroidRuntime(9498):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-19 09:32:05.580:E/AndroidRuntime(9498):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-19 09:32:05.580:E/AndroidRuntime(9498):在dalvik.system.NativeStart.main(本机方法)它给出了这一行的错误:
txtView.setText((CharSequence) result);
因为它不能自动将AsyncTask
转换为CharSequence
。应该是这样的:
txtView.setText(result.toString());
在TextView上显示结果应该在AsyncTask类的postExecute上完成。所以实现这个方法并在那里设置值
protected void onPostExecute(String result) {
txtView = (TextView)findViewById(R.id.txtView);
txtView.setText(result);
}
无法从类型活动对非静态方法findViewById(int)进行静态引用way@ClaireG从AsyncTask类中删除静态标识符。谢谢,这很有效。但是,我仍然在主帖子编辑的onPostExecute()处收到一个NullPointerException,非常抱歉,但是代码格式不起作用ExecuteSelect()只是一个查询字符串。要进行实际查询,应该转到db.rawQuery(executeSelect(),null);谢谢你,桑德斯塔。这修复了logcat中提供的错误,但它仍然无法工作。
txtView.setText(result.toString());
protected void onPostExecute(String result) {
txtView = (TextView)findViewById(R.id.txtView);
txtView.setText(result);
}