2014-01-10 31 views
0

Databasehelp.javaAndroid的另一項活動叫主要活動Databasehelper功能失敗

package com.example.abc2; 

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/com.example.abc2/databases/"; 

private static String DB_NAME = "DB_BusData"; 

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[1024]; 
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; 
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

} 

@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. 

} 

MainActivity.java

public void printInspectorFormat(){ 
    try { 
     Log.d(null,"1234545"); 
     DataBaseHelper myDbHelper = new DataBaseHelper(this.getApplicationContext()); 
     myDbHelper = new DataBaseHelper(this); 
     try { 
     myDbHelper.createDataBase(); 
     } catch (IOException ioe) { 
     throw new Error("Unable to create database"); 
     } 
     try { 
     myDbHelper.openDataBase();   
     }catch(SQLException sqle){ 
     throw sqle; 
     } 
} 

UltililyActivity.java

MainActivity cls2= new MainActivity(); 
cls2.printInspectorFormat(); 

當Ultility活動我嘗試打電話主要活動功能,但返回錯誤

java.lang.NullPointerException 

也許databasehelper不會共享?或者是什麼?如何解決這個問題?

+2

不要做'new ... Activity()'。它不會工作。通過你自己的情況。 – zapl

+0

你永遠不應該創建一個活動類的實例。http://stackoverflow.com/questions/14956018/can-i-create-the-object-of-a-activity-in-other-class – Raghunandan

+0

@zapl如何解決這個?例?請 –

回答

1

您不能自己創建Activity的實例。他們缺少系統在創建時添加的Context。如果您通過new Activity()自行創建,幾乎所有可以用Activity做的事情都會失敗。

但是,您可以將您的printInspectorFormat移動到另一個負責數據庫訪問的類中,並添加一個Context參數。現在每個Activity都可以通過將自身作爲上下文來使用該方法。

class DbBackend { 
    public static void printInspectorFormat(Context context) { 
     try { 
      Log.d(null,"1234545"); 
      DataBaseHelper myDbHelper = new DataBaseHelper(context.getApplicationContext()); 
      try { 
      myDbHelper.createDataBase(); 
      } catch (IOException ioe) { 
      throw new Error("Unable to create database"); 
      } 
      try { 
      myDbHelper.openDataBase();   
      }catch(SQLException sqle){ 
      throw sqle; 
      } 
    } 
} 

任何Activity

DbBackend.printInspectorFormat(this); 

你也應該考慮使用像https://github.com/jgilfelt/android-sqlite-asset-helper基於資產數據庫堅實的實現,因爲你看起來不是很安全。也可以閱讀像http://www.vogella.de/articles/AndroidSQLite/article.html這樣的教程,它也向您展示瞭如何使用SQLiteOpenHelper的一些模式。

+0

我可以給你一個吻嗎?萬分感謝。這是工作! –

相關問題