Android SQLite导致崩溃
每当调用此方法时,我的应用程序几乎会立即崩溃,而我已经花了几个小时来处理它。我对SQL非常陌生,甚至对Android编程也比较陌生,所以这里的代码有什么问题吗?我想我可能遗漏了与光标有关的其他内容,但我没有任何人要问。提前感谢:Android SQLite导致崩溃,android,sqlite,crash,Android,Sqlite,Crash,每当调用此方法时,我的应用程序几乎会立即崩溃,而我已经花了几个小时来处理它。我对SQL非常陌生,甚至对Android编程也比较陌生,所以这里的代码有什么问题吗?我想我可能遗漏了与光标有关的其他内容,但我没有任何人要问。提前感谢: public String fillTimetable(String day, String week, String lesson){ String[] column = new String[]{KEY_SUBJECT}; String select
public String fillTimetable(String day, String week, String lesson){
String[] column = new String[]{KEY_SUBJECT};
String selection = "WHERE "+KEY_DAY+" = '"+day+"' AND "+KEY_WEEK+" = '"+week+"' AND "+KEY_LESSON+" = '"+lesson+"';";
Cursor c = ourDatabase.query(DATABASE_TABLE, column, selection, null, null,
null, null);
int iSubject = c.getColumnIndex(KEY_SUBJECT);
return c.getString(iSubject);
}//end fillTimetable
日志Cat报告:
02-27 22:17:52.180: E/AndroidRuntime(8062): FATAL EXCEPTION: main
02-27 22:17:52.180: E/AndroidRuntime(8062): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.shearer.schooltimetable/com.shearer.schooltimetable.Tabs}: java.lang.NullPointerException
02-27 22:17:52.180: E/AndroidRuntime(8062): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2106)
02-27 22:17:52.180: E/AndroidRuntime(8062): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
02-27 22:17:52.180: E/AndroidRuntime(8062): at android.app.ActivityThread.access$600(ActivityThread.java:141)
02-27 22:17:52.180: E/AndroidRuntime(8062): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
02-27 22:17:52.180: E/AndroidRuntime(8062): at android.os.Handler.dispatchMessage(Handler.java:99)
02-27 22:17:52.180: E/AndroidRuntime(8062): at android.os.Looper.loop(Looper.java:137)
02-27 22:17:52.180: E/AndroidRuntime(8062): at android.app.ActivityThread.main(ActivityThread.java:5041)
02-27 22:17:52.180: E/AndroidRuntime(8062): at java.lang.reflect.Method.invokeNative(Native Method)
02-27 22:17:52.180: E/AndroidRuntime(8062): at java.lang.reflect.Method.invoke(Method.java:511)
02-27 22:17:52.180: E/AndroidRuntime(8062): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-27 22:17:52.180: E/AndroidRuntime(8062): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-27 22:17:52.180: E/AndroidRuntime(8062): at dalvik.system.NativeStart.main(Native Method)
02-27 22:17:52.180: E/AndroidRuntime(8062): Caused by: java.lang.NullPointerException
02-27 22:17:52.180: E/AndroidRuntime(8062): at android.app.Activity.findViewById(Activity.java:1839)
02-27 22:17:52.180: E/AndroidRuntime(8062): at com.shearer.schooltimetable.Tabs.<init>(Tabs.java:19)
02-27 22:17:52.180: E/AndroidRuntime(8062): at java.lang.Class.newInstanceImpl(Native Method)
02-27 22:17:52.180: E/AndroidRuntime(8062): at java.lang.Class.newInstance(Class.java:1319)
02-27 22:17:52.180: E/AndroidRuntime(8062): at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
02-27 22:17:52.180: E/AndroidRuntime(8062): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
02-27 22:17:52.180: E/AndroidRuntime(8062): ... 11 more
02-27 22:17:52.180:E/AndroidRuntime(8062):致命异常:主
02-27 22:17:52.180:E/AndroidRuntime(8062):java.lang.RuntimeException:无法实例化活动组件信息{com.shearer.schooltime/com.shearer.schooltime.Tabs}:java.lang.NullPointerException
02-27 22:17:52.180:E/AndroidRuntime(8062):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2106)
02-27 22:17:52.180:E/AndroidRuntime(8062):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
02-27 22:17:52.180:E/AndroidRuntime(8062):在android.app.ActivityThread.access$600(ActivityThread.java:141)
02-27 22:17:52.180:E/AndroidRuntime(8062):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
02-27 22:17:52.180:E/AndroidRuntime(8062):在android.os.Handler.dispatchMessage(Handler.java:99)上
02-27 22:17:52.180:E/AndroidRuntime(8062):在android.os.Looper.loop(Looper.java:137)上
02-27 22:17:52.180:E/AndroidRuntime(8062):在android.app.ActivityThread.main(ActivityThread.java:5041)上
02-27 22:17:52.180:E/AndroidRuntime(8062):位于java.lang.reflect.Method.Invokenactive(本机方法)
02-27 22:17:52.180:E/AndroidRuntime(8062):位于java.lang.reflect.Method.invoke(Method.java:511)
02-27 22:17:52.180:E/AndroidRuntime(8062):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-27 22:17:52.180:E/AndroidRuntime(8062):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-27 22:17:52.180:E/AndroidRuntime(8062):在dalvik.system.NativeStart.main(本机方法)
02-27 22:17:52.180:E/AndroidRuntime(8062):由以下原因引起:java.lang.NullPointerException
02-27 22:17:52.180:E/AndroidRuntime(8062):在android.app.Activity.findViewById(Activity.java:1839)
02-27 22:17:52.180:E/AndroidRuntime(8062):在com.shearer.schooltime.Tabs.(Tabs.java:19)
02-27 22:17:52.180:E/AndroidRuntime(8062):位于java.lang.Class.newInstanceImpl(本机方法)
02-27 22:17:52.180:E/AndroidRuntime(8062):位于java.lang.Class.newInstance(Class.java:1319)
02-27 22:17:52.180:E/AndroidRuntime(8062):在android.app.Instrumentation.newActivity(Instrumentation.java:1054)上
02-27 22:17:52.180:E/AndroidRuntime(8062):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
02-27 22:17:52.180:E/AndroidRuntime(8062):。。。还有11个
从堆栈跟踪:
Caused by: java.lang.NullPointerException
at android.app.Activity.findViewById(Activity.java:1839)
at com.shearer.schooltimetable.Tabs.<init>(Tabs.java:19)
使用?
占位符作为带有selectionArgs
的文本也是明智的,例如,避免SQL注入,例如:
String selection = KEY_DAY+" = ? AND "+KEY_WEEK+" = ? AND "+KEY_LESSON+" = ?";
String[] selectionArgs = new String[] { day, week, lesson };
Cursor c = ...query(..., selection, selectionArgs, ...);
在query()
之后,光标
尚未指向有效的结果行。在尝试使用getString()
访问行数据之前,请使用moveTo…
方法之一将其移动:
如上图所示,显式关闭光标也是一个好主意。您丢失了一些东西……崩溃的日志。请编辑并添加您的帖子,这样我们可以帮助您更轻松。由于光标位于第一行之前,您应该始终将其移动到第一条记录:
c.moveToFirst()代码>在消费它之前。从:返回:光标对象,位于第一个条目之前。
我按照您的说明更改了代码,试图修复它,但我的应用程序仍在崩溃。我遇到了这个错误:java.lang.RuntimeException:无法启动activityComponentInfo{com.shearer.schooltime/com.shearer.schooltime.Tabs}:java.lang.NullPointerException,我认为这可能是因为我没有考虑如果数据库返回“null”该怎么办,但这仍然没有解决它。有什么想法吗?SorryLook查看NPE异常的行号,并查看它在代码中指向的位置。它指向我尝试从数据库中提取数据的位置,这不是避免NPE的好方法吗?-如果(temp!=null){tvs[i].setText(temp);}则tvs
或tvs[i]
为null。您可以使用调试器来查找。然而,它似乎不再与这个问题相关,所以如果你有问题,考虑发布一个新的问题。
String selection = KEY_DAY+" = ? AND "+KEY_WEEK+" = ? AND "+KEY_LESSON+" = ?";
String[] selectionArgs = new String[] { day, week, lesson };
Cursor c = ...query(..., selection, selectionArgs, ...);
Cursor c = ....;
String result = null;
if (c.moveToFirst()) {
int iSubject = c.getColumnIndex(KEY_SUBJECT);
result = c.getString(iSubject);
}
c.close();
return result;