2013-01-11 140 views
0

當我嘗試將我的意圖加載到處理我的數據庫中的數據的列表視圖的類時,我得到'NullPointerException'。當談到列表視圖時,我是一個全新手,所以希望有人能告訴我我哪裏出錯了!Android空指針異常

我在考慮空指針是由於沒有數據被發現在第一行posistion光標所在,但我認爲看着logcat,它是我的XML佈局的一個問題'項?

我的繼承人爲ListView類:

package com.example.sqliteexample; 



import android.app.Activity; 
import android.app.ListActivity; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.widget.ListView; 

public class SQLView extends Activity { 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    HotOrNot H = new HotOrNot(this, null, null); 

    setContentView(R.layout.layout); 
    ListView listContent = (ListView)findViewById(R.id.contentList); 

    HotOrNot Content = new HotOrNot(this, null, null); 

    Cursor cursor = Content.getData(); 

    startManagingCursor(cursor); 

    @SuppressWarnings("static-access") 
    String [] from = new String [] {H.KEY_NAME, H.KEY_HOTNESS}; 
    int [] to = new int [] {R.id.txtName, R.id.txtAge}; 

    @SuppressWarnings("deprecation") 
    SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this, R.layout.entries, cursor, from, to); 

    listContent.setAdapter(cursorAdapter); 

從我的數據庫處理程序類 '的getData' 的方法:

public Cursor getData() { 

     String [] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_HOTNESS}; 
     Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); 


     return c; 

HotOrNot DB處理類:

package com.example.sqliteexample; 

import android.app.ListActivity; 
import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.widget.ListView; 

public class HotOrNot { 

public static final String KEY_ROWID = "_id"; 
public static final String KEY_NAME = "persons_name"; 
public static final String KEY_HOTNESS = "persons_hotness"; 

private static String DATABASE_NAME = "HotOrNotdb"; 
private static String DATABASE_TABLE = "peopleTable"; 
private static int DATABASE_VERSION = 30; 

private static DBHelper ourHelper; 
private static Context ourContext; 
private static SQLiteDatabase ourDatabase; 

ListView listview; 


public void DB_NAME(String DBName) 
{ 
    DATABASE_NAME = DBName; 

} 

public String returnDB_NAME() 
{ 
    return DATABASE_NAME; 
} 


public void DB_tableNAME(String DBtName) 
{ 
    DATABASE_TABLE = DBtName; 

} 

public String returnDB_tNAME() 
{ 
    return DATABASE_TABLE; 
} 


public void DB_NAME(int DBVersion) 
{ 
    DATABASE_VERSION = DBVersion; 

} 

public int returnDB_VERSION() 
{ 
    return DATABASE_VERSION; 
} 



// class constructor for context. when the object is constructed in the main programme 
// the context of that class i.e 'this' is sent to this constructor to set the object context. 
// null values set on SQLiteDatabase and DBhelper as there is nothing to pass from the called 
// objects. 
public HotOrNot (Context c, SQLiteDatabase newSQL, DBHelper BD) 
{ 
    ourContext = c; 
    ourDatabase = newSQL; 
    ourHelper = BD; 

} 







private static class DBHelper extends SQLiteOpenHelper 
{ 
    public DBHelper(Context context) { 
     super(context, KEY_NAME, null, DATABASE_VERSION); 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 


     db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + 
       KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       KEY_NAME + " TEXT NOT NULL, " + 
       KEY_HOTNESS + " TEXT NOT NULL);" 

       ); 


    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

     db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
     onCreate(db); 
    } 
} 



    public HotOrNot open() throws SQLException 
    { 

     ourHelper = new DBHelper(ourContext); 
     ourDatabase = ourHelper.getWritableDatabase(); 
     return this; 

    } 

    public void close() 
    { 
     ourHelper.close(); 

    } 

    public long createEntry(String name, String hotness) { 


     ContentValues cv = new ContentValues(); 
     cv.put(KEY_NAME, name); 
     cv.put(KEY_HOTNESS, hotness); 
     return ourDatabase.insert(DATABASE_TABLE, null, cv); 

    } 

    public Cursor getData() { 

     String [] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_HOTNESS}; 
     Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); 
     //String result = ""; 

     //int iRow = c.getColumnIndex(KEY_ROWID); 
     //int iName = c.getColumnIndex(KEY_NAME); 
     //int ihotness = c.getColumnIndex(KEY_HOTNESS); 

     //for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) 
     //{ 
      //result = result + c.getString(iRow) + "" + c.getString(iName) + "" + c.getString(ihotness); 

     //} 

     //c.close(); 

     return c; 
    } 

    public String getName(long l) { 

     String [] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_HOTNESS}; 
     Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "=" + l, null, null, null, null); 
     if(c != null) 
     { 
      // move to the selected row 
     c.moveToFirst(); 
     String name = c.getString(1); 
     return name; 
     } 
     return null; 

    } 


    public String getHotness(long l) { 

     String [] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_HOTNESS}; 
     Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "=" + l, null, null, null, null); 
     if(c != null) 
     { 
      // move to the selected row 
     c.moveToFirst(); 
     String hotness = c.getString(2); 
     return hotness; 

    } 
     return null; 


    } 

    public void updateEntry(long newl, String nameEdit, String hotnessEdit) { 
    ContentValues cvUpdate = new ContentValues(); 

    cvUpdate.put(KEY_NAME, nameEdit); 
    cvUpdate.put(KEY_HOTNESS, hotnessEdit); 

    ourDatabase.update(DATABASE_TABLE, cvUpdate, KEY_ROWID + "=" + newl, null); 


    } 

    public void delID(long l) { 
     ourDatabase.delete(DATABASE_TABLE, KEY_ROWID + "=" + l, null); 

    } 

}

My XM大號佈局爲ListView:

<?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="match_parent" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/txtName" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Name:" /> 

<TextView 
    android:id="@+id/txtAge" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Age:" /> 

</LinearLayout> 

ListView的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="match_parent" 
android:orientation="vertical" > 

<ListView 
    android:id="@+id/contentList" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 
</ListView> 

</LinearLayout> 

的logcat:

01-11 00:23:26.655: D/AndroidRuntime(272): Shutting down VM 
01-11 00:23:26.655: W/dalvikvm(272): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
01-11 00:23:26.675: E/AndroidRuntime(272): FATAL EXCEPTION: main 
01-11 00:23:26.675: E/AndroidRuntime(272): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sqliteexample/com.example.sqliteexample.SQLView}: java.lang.NullPointerException 
01-11 00:23:26.675: E/AndroidRuntime(272): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
01-11 00:23:26.675: E/AndroidRuntime(272): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
01-11 00:23:26.675: E/AndroidRuntime(272): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
01-11 00:23:26.675: E/AndroidRuntime(272): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
01-11 00:23:26.675: E/AndroidRuntime(272): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-11 00:23:26.675: E/AndroidRuntime(272): at android.os.Looper.loop(Looper.java:123) 
01-11 00:23:26.675: E/AndroidRuntime(272): at android.app.ActivityThread.main(ActivityThread.java:4627) 
01-11 00:23:26.675: E/AndroidRuntime(272): at java.lang.reflect.Method.invokeNative(Native Method) 
01-11 00:23:26.675: E/AndroidRuntime(272): at java.lang.reflect.Method.invoke(Method.java:521) 
01-11 00:23:26.675: E/AndroidRuntime(272): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
01-11 00:23:26.675: E/AndroidRuntime(272): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
01-11 00:23:26.675: E/AndroidRuntime(272): at dalvik.system.NativeStart.main(Native Method) 
01-11 00:23:26.675: E/AndroidRuntime(272): Caused by: java.lang.NullPointerException 
01-11 00:23:26.675: E/AndroidRuntime(272): at com.example.sqliteexample.HotOrNot.getData(HotOrNot.java:143) 
01-11 00:23:26.675: E/AndroidRuntime(272): at com.example.sqliteexample.SQLView.onCreate(SQLView.java:24) 
01-11 00:23:26.675: E/AndroidRuntime(272): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
01-11 00:23:26.675: E/AndroidRuntime(272): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
+0

HotOrNot.java中的第143行在哪裏? –

+1

看起來像'ourDatabase'爲空。你在哪裏初始化它? – Zhedar

+1

whats'ourDatabase' – petey

回答

3

你根本忘了打電話給open()

HotOrNot Content = new HotOrNot(this, null, null); 
Content.open(); 
Cursor cursor = Content.getData(); 

(但請閱讀關於Java命名約定,其狀態變量必須以小寫字母開頭。)

+1

+1對於一個很好的捕獲。 :-) –

+1

我很高興我可以幫忙,我希望那個低估了我的人會意識到自己的錯誤... – Sam

0
public HotOrNot (Context c, SQLiteDatabase newSQL, DBHelper BD) 
{ 
    ourContext = c; 
    ourDatabase = newSQL; 
    ourHelper = BD; 

} 

在這裏,你會傳遞null在OnCreate到SQLiteDatabase

HotOrNot H = new HotOrNot(this, null, null); 
+1

@ user1352057我想說,如果你會叫'open()',你會避免了NPE。另外,請將您的內部類放在文件的末尾,而不是中間,讀起來會讓人感到困惑。 –

+0

該建築是很好的DGomez。但是對於你的回答。 @Sam,你100%正確! – user1352057