L'application Android de la force se ferme lors de la configuration d'un CursorAdapter

Je suis un didacticiel vidéo sur l'Udemy.com de ici

Tout a bien été jusqu'à jouer avec le langage SQL. Maintenant, je ne suis pas un total SQL newbie, j'ai effectivement pris un cours de niveau collégial sur l'aide de SQL à partir de la ligne de commande, mais je ne suis pas un pro non plus. L'application ne fait pas d'erreur lors de la compilation, mais donne tout de suite la force de fermeture, et mon logcat points me lvCountries.setAdapter(adapter). La partie qui m'intéresse est "Tentative d'invoquer la méthode virtuelle" void android.widget de.ListView.setAdapter(android.widget de.ListAdapter) "sur un objet nul de référence". Ce serait ma adaptateur être l'objet nul, ou lvCountries? Mon dernier plomb est lorsque j'instancie pays avec la db.query(). Android Studio me donne un avertissement en disant qu'il pourrait produire une NullPointerExecption. Merci à tous à l'avance.

01-15 08:39:59.560    9056-9056/com.example.sql E/AndroidRuntime FATAL EXCEPTION: main
Process: com.example.sql, PID: 9056
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sql/com.example.sql.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
at com.example.sql.MainActivity.onCreate(MainActivity.java:44)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)

MainActivity.java

package com.example.sql;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.provider.BaseColumns;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class MainActivity extends ActionBarActivity {
private CountryDB countryDatabase = null;
private Cursor countries = null;
private ListView lvCountries = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Create the database helper
SQLiteDatabase.CursorFactory factory = null;
countryDatabase = new CountryDB(this, "countryDB", factory);
String[] columnNames = {"Name", "Pop", "Area", BaseColumns._ID};
lvCountries = (ListView) findViewById(R.id.lvCountries);
int[] targetLayoutIDs = {R.id.textName, R.id.textPop, R.id.textArea};
SQLiteDatabase db = countryDatabase.getReadableDatabase();
countries = db.query("countries", columnNames, null, null, null, null, null);
CursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.country_item,
countries, columnNames, targetLayoutIDs, 0);
lvCountries.setAdapter(adapter);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment())
.commit();
}
}
public void onPause() {
super.onPause();
countryDatabase.close();
}
@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;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//Handle action bar item clicks here. The action bar will
//automatically handle clicks on the Home/Up button, so long
//as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
return rootView;
}
}
}

country_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/textName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium" />
<LinearLayout 
android:id="@+id/subItem"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/popLabel" />
<TextView
android:id="@+id/textPop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView 
android:layout_width= "5dp" 
android:layout_height="wrap_content" 
android:text="@string/space" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/areaLabel" />
<TextView
android:id="@+id/textArea"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView 
android:layout_width= "5dp" 
android:layout_height="wrap_content" 
android:text="@string/space" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/areaDescriptor" />
</LinearLayout>
</LinearLayout>

Voici le reste de mon code dans Android Studio format si vous êtes intéressé. http://www.mediafire.com/download/zu0x71ysl67b779/SQLLiteAndListViews.tar.gz

OriginalL'auteur user71607 | 2014-01-15