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,在片段列表视图中使用数据库时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

可扩展列表视图在 android 的片段活动中不起作用

Android,从其他片段返回的空列表视图

在我的 android 应用程序中滚动列表视图时,数据正在消失。我在片段中使用列表视图

Android列表视图不适用于片段

在片段中使用列表视图

单击ListViewItem时Android加载片段