2012-06-23 49 views
0

這是類Db.java光標給空指針異常的Android預裝的數據庫

package calc.three; 

import java.io.IOException; 

import android.app.Activity; 
import android.app.ListActivity; 
import android.content.ContentValues; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.database.sqlite.SQLiteDatabase; 
import android.widget.AdapterView; 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 

public class Db extends ListActivity { 
private SQLiteDatabase newDb; 
DataBaseHelper myDbHelper = new DataBaseHelper(this); 
public ListAdapter adapter; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
    openDatabase(); 

    Cursor c = newDb.rawQuery("SELECT _id, organisation FROM shoplist", null); 
    adapter = new SimpleCursorAdapter(this, R.layout.main, c, new String[] { "organisation" }, new int[] { android.R.id.list }); 
    setListAdapter(adapter); 
    //inserttodata(); 
    myDbHelper.close(); 
} 

private long inserttodata() { 
    // TODO Auto-generated method stub 
    ContentValues cv = new ContentValues(); 
    cv.put("id", "112"); 
    cv.put("organisation","test"); 
    return newDb.insert("shoplist", null, cv); 
} 

private void openDatabase() { 

    try { 

     myDbHelper.createDataBase(); 

    } catch (IOException ioe) { 

     throw new Error("Unable to create database"); 

    } 

    try { 

     myDbHelper.openDataBase(); 


    } catch (SQLException sqle) { 
System.out.println("failed to open"); 
     throw sqle; 

    } 
    //String[] columns= new String[]{"_id", "Organisation"}; 
    //cursor = newDb.query("Shop", columns, null, null, null, null, null); 

} 

} 

這個DataBaseHelper類

package calc.three; 

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import android.content.Context; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DataBaseHelper extends SQLiteOpenHelper{ 

//The Android's default system path of your application database. 
private static String DB_PATH = "/data/data/calc.three/databases/"; 

private static String DB_NAME = "charity.db"; 

private SQLiteDatabase myDataBase; 

private final Context myContext; 

/** 
* Constructor 
* Takes and keeps a reference of the passed context in order to access to the application assets and resources. 
* @param context 
*/ 
public DataBaseHelper(Context context) { 

    super(context, DB_NAME, null, 1); 
    this.myContext = context; 
} 

    /** 
    * Creates a empty database on the system and rewrites it with your own database. 
    * */ 
    public void createDataBase() throws IOException{ 

    boolean dbExist = checkDataBase(); 

    if(dbExist){ 
     //do nothing - database already exist 
    }else{ 

     //By calling this method and empty database will be created into the default system path 
      //of your application so we are gonna be able to overwrite that database with our database. 
     this.getReadableDatabase(); 

     try { 

      copyDataBase(); 

     } catch (IOException e) { 

      throw new Error("Error copying database"); 

     } 
    } 

} 

/** 
* Check if the database already exist to avoid re-copying the file each time you open the application. 
* @return true if it exists, false if it doesn't 
*/ 
private boolean checkDataBase(){ 

    SQLiteDatabase checkDB = null; 

    try{ 
     String myPath = DB_PATH + DB_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

    }catch(SQLiteException e){ 

     //database does't exist yet. 

    } 

    if(checkDB != null){ 

     checkDB.close(); 

    } 

    return checkDB != null ? true : false; 
} 

/** 
* Copies your database from your local assets-folder to the just created empty database in the 
* system folder, from where it can be accessed and handled. 
* This is done by transfering bytestream. 
* */ 
private void copyDataBase() throws IOException{ 

    //Open your local db as the input stream 
    InputStream myInput = myContext.getAssets().open(DB_NAME); 

    // Path to the just created empty db 
    String outFileName = DB_PATH + DB_NAME; 

    //Open the empty db as the output stream 
    OutputStream myOutput = new FileOutputStream(outFileName); 

    //transfer bytes from the inputfile to the outputfile 
    byte[] buffer = new byte[2048]; 
    int length; 
    while ((length = myInput.read(buffer))>0){ 
     myOutput.write(buffer, 0, length); 
    } 

    //Close the streams 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 

} 

public void openDataBase() throws SQLException{ 

    //Open the database 
    String myPath = DB_PATH + DB_NAME; 
    SQLiteDatabase.CursorFactory c = null; 
    myDataBase = SQLiteDatabase.openDatabase(myPath, c , SQLiteDatabase.OPEN_READWRITE); 

} 

@Override 
public synchronized void close() { 

     if(myDataBase != null) 
      myDataBase.close(); 

     super.close(); 

} 

@Override 
public void onCreate(SQLiteDatabase db) { 

} 

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

} 

    // Add your public helper methods to access and get content from the database. 
    // You could return cursors by doing "return myDataBase.query(....)" so it'd be easy 
    // to you to create adapters for your views. 

} 

的XML佈局

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<ListView 
    android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="3dip" > 
</ListView> 

    </LinearLayout> 

我不是試圖在這裏做很多事情。我發佈了一個.db文件,將其複製到資產文件夾中,併成功發生......創建副本之後,我在sqlite瀏覽器中從data/data/calc.three/database打開了.db文件,並且在那裏有表格。

但我似乎無法運行它強制關閉的應用程序,並給我一個nullPointerException在行傳遞一個rawQuery到光標我運行該程序沒有該行,並沒有錯誤,但我不能顯示數據列表視圖。請幫助我在過去3天裏一直堅持這一項。

謝謝

回答

1

您沒有設置newDb ...你宣佈它,但是當你嘗試使用它,給你的錯誤它仍然是零。

+0

你能告訴我我該怎麼做 – Ankit

+0

我認爲你是對的沒有得到錯誤,但有一些新的東西與上述代碼 android.widget.ListView不是一個視圖,可以通過限制這個SimpleCursorAdapter – Ankit

+0

你有id倒退。它需要是'android:id =「@ id/android:list」' – Barak