Eclipse android,在片段列表视图中使用数据库时出现异常
Posted
技术标签:
【中文标题】Eclipse android,在片段列表视图中使用数据库时出现异常【英文标题】:Eclipse android, exception when using database in fragment listview 【发布时间】:2015-11-01 14:17:31 【问题描述】:我已经找了好几个小时了,但仍然收到相同的错误消息。 我是 eclipse 的新手,如果有人能解释我做错了什么,我将不胜感激。
我正在做一个小项目,我可以在其中获得包含游戏的列表视图。我可以将它们分类到愿望清单或已播放的清单中。
在这个片段中,我想展示一个包含游戏标题的简单列表视图。每次我尝试打开片段时,应用程序都会崩溃并出现以下错误:
08-09 16:15:10.752:E/androidRuntime(2253):致命异常:主要 08-09 16:15:10.752:E/AndroidRuntime(2253):过程: be.thomasmore.GameLab_2, PID: 2253 08-09 16:15:10.752: E/AndroidRuntime(2253): java.lang.RuntimeException: 无法启动 活动 组件信息be.thomasmore.GameLab_2/be.thomasmore.GameLab_2.MainActivity: java.lang.NullPointerException 08-09 16:15:10.752: E/AndroidRuntime(2253):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 08-09 16:15:10.752: E/AndroidRuntime(2253): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 08-09 16:15:10.752: E/AndroidRuntime(2253): 在 android.app.ActivityThread.access$800(ActivityThread.java:135) 08-09 16:15:10.752:E/AndroidRuntime(2253):在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 08-09 16:15:10.752: E/AndroidRuntime(2253): 在 android.os.Handler.dispatchMessage(Handler.java:102) 08-09 16:15:10.752:E/AndroidRuntime(2253):在 android.os.Looper.loop(Looper.java:136) 08-09 16:15:10.752: E/AndroidRuntime(2253):在 android.app.ActivityThread.main(ActivityThread.java:5017) 08-09 16:15:10.752:E/AndroidRuntime(2253):在 java.lang.reflect.Method.invokeNative(Native Method) 08-09 16:15:10.752:E/AndroidRuntime(2253):在 java.lang.reflect.Method.invoke(Method.java:515) 08-09 16:15:10.752: E/AndroidRuntime(2253):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 08-09 16:15:10.752: E/AndroidRuntime(2253): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 08-09 16:15:10.752:E/AndroidRuntime(2253):在 dalvik.system.NativeStart.main(本机方法)08-09 16:15:10.752: E/AndroidRuntime(2253):引起:java.lang.NullPointerException 08-09 16:15:10.752: E/AndroidRuntime(2253): 在 android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) 08-09 16:15:10.752: E/AndroidRuntime(2253): 在 android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188) 08-09 16:15:10.752: E/AndroidRuntime(2253): 在 be.thomasmore.GameLab_2.DatabaseHelper.getSpellen(DatabaseHelper.java:223) 08-09 16:15:10.752: E/AndroidRuntime(2253): 在 be.thomasmore.GameLab_2.GameFragmentTab.readSpellen(GameFragmentTab.java:57) 08-09 16:15:10.752: E/AndroidRuntime(2253): 在 be.thomasmore.GameLab_2.GameFragmentTab.onCreateView(GameFragmentTab.java:36) 08-09 16:15:10.752: E/AndroidRuntime(2253): 在 android.app.Fragment.performCreateView(Fragment.java:1700) 08-09 16:15:10.752:E/AndroidRuntime(2253):在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890) 08-09 16:15:10.752: E/AndroidRuntime(2253): 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 08-09 16:15:10.752: E/AndroidRuntime(2253): 在 android.app.BackStackRecord.run(BackStackRecord.java:684) 08-09 16:15:10.752:E/AndroidRuntime(2253):在 android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) 08-09 16:15:10.752: E/AndroidRuntime(2253): 在 android.app.Activity.performStart(Activity.java:5240) 08-09 16:15:10.752:E/AndroidRuntime(2253):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2168) 08-09 16:15:10.752: E/AndroidRuntime(2253): ... 11 更多
这是我的片段:
公共类 GameFragmentTab 扩展片段
private DatabaseHelper db; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) View rootView = inflater.inflate(R.layout.activitygame_layout, container, false); return rootView; @Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); db = new DatabaseHelper(getActivity()); readSpellen(); private void readSpellen() final List<Spel> spellen = db.getSpellen(); ArrayAdapter<Spel> adapter = new ArrayAdapter<Spel>(getActivity(),android.R.layout.simple_list_item_1,spellen); final ListView listViewSpellen = (ListView) getActivity().findViewById(R.id.listViewSpellen); listViewSpellen.setAdapter(adapter);
这是我在创建 getSpellen() (getGames) 的地方创建的 DatabaseHelper 的一部分。我知道这通常有效,因为我制作了没有碎片的同一个项目。
公共类 DatabaseHelper 扩展 SQLiteOpenHelper // 数据库版本 私有静态最终 int DATABASE_VERSION = 2; // 数据库名称 私有静态最终字符串 DATABASE_NAME = "游戏";
// uitgevoerd bij instantiatie van DatabaseHelper // -> als database nog niet bestaat, dan creÎren (call onCreate) // -> als de DATABASE_VERSION hoger is dan de huidige versie, // dan upgraden (call onUpgrade) public DatabaseHelper(Context context) super(context, DATABASE_NAME, null, DATABASE_VERSION);
@Override public void onCreate(SQLiteDatabase db)
//spel String CREATE_TABLE_SPEL = "CREATE TABLE spel (" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "naam TEXT," + "jaar INTEGER," + "hoofdpersonage TEXT," + "leeftijdsklasse TEXT," + "ratingbeschrijving TEXT," + "rating TEXT," + "studioId INTEGER," + "genreId INTEGER," + "platformId INTEGER)"; db.execSQL(CREATE_TABLE_SPEL);
公共列表 getSpellen() 列表 lijst = new ArrayList();
String selectQuery = "SELECT * FROM spel ORDER BY naam"; SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); if (cursor.moveToFirst()) do Spel spel = new Spel(cursor.getLong(0), cursor.getString(1), cursor.getString(2),cursor.getString(3),
cursor.getString(4),cursor.getString(5), cursor.getInt(6),cursor.getInt(7),cursor.getInt(8),cursor.getInt(9)); lijst.add(spel); while (cursor.moveToNext());
cursor.close(); db.close(); return lijst;
当然我也插入了一些游戏。 如果这个问题不是 100%,我很抱歉,这是我发布的第一个问题。 提前谢谢你。
【问题讨论】:
您好,log-cat 有点丢失。当发布错误时,应该有一个地方写着 Caused By... 这实际上是错误的真正位置,单击此行将带您进入代码中的特定行。这将帮助我们找出问题 我发现的原因是: 原因:java.lang.NullPointerException 但是,当我尝试双击 logcat 中的某些内容时,什么都没有发生.. 我的 Eclipse 坏了吗?因为我过去已经遇到过一些问题 我不想让你双击请继续 Caused by : Null PointerException at ... 并且到最后它应该显示:(类名:某个数字)。请张贴整个事情 08-09 19:33:13.607: E/AndroidRuntime(1277): 由: java.lang.NullPointerException 08-09 19:33:13.607: E/AndroidRuntime(1277): at be .thomasmore.GameLab_2.GameFragmentTab.readSpellen(GameFragmentTab.java:201) 好的,很好。现在,当您单击(仅在 GrameFragmentTab.java : 201 上的一个)时,它在代码中指的是哪里?复制过去的代码行 【参考方案1】:我猜listview是空的,因为你没有从onCreateView访问它,就好像没有从xml引用它一样,所以:
public class GameFragmentTab extends Fragment
private DatabaseHelper db;
final ListView listViewSpellen;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
View rootView = inflater.inflate(R.layout.activitygame_layout, container, false);
listViewSpellen = (ListView) rootView.findViewById(R.id.listViewSpellen);
db = new DatabaseHelper(getActivity());
readSpellen();
private void readSpellen()
final List<Spel> spellen = db.getSpellen();
ArrayAdapter<Spel> adapter = new ArrayAdapter<Spel>(getActivity(),android.R.layout.simple_list_item_1,spellen);
listViewSpellen.setAdapter(adapter);
return rootView;
【讨论】:
它仍然给我同样的错误。我可能认为它与数据库有关。但是当我在正常活动中做完全相同的事情而不是片段时,一切正常。我是否忘记了特定的行或其他内容?我可能需要使用 onActivitycreated 吗?我也是新碎片,所以我不太确定什么太有用。 那么适配器为空。请检查我编辑的答案 是的!现在可以了!所以你实际上不需要 OnCreate 函数?但是非常非常感谢! @Elijenta 如果此解决方案适合您,请接受答案,以便其他人受益。此外,在片段中 onCreateView 充当 onCreate。我随时准备提供帮助。快乐编码以上是关于Eclipse android,在片段列表视图中使用数据库时出现异常的主要内容,如果未能解决你的问题,请参考以下文章