2012-06-19 70 views
-1

這裏是數據庫類。它在getReadableDatabase()中顯示錯誤。以下是日誌文件。請幫助我,錯誤在哪裏。Android中的錯誤閱讀數據庫

package achira.test; 

    import android.content.ContentValues; 
    import android.content.Context; 
    import android.database.Cursor; 
    import android.database.sqlite.SQLiteDatabase; 
    import android.database.sqlite.SQLiteOpenHelper; 

public class DatabaseHelper extends SQLiteOpenHelper { 

static final String dbName="achira"; 
static final String employeeTable="patient"; 
static final String colID="UID"; 
static final String colName="patientName"; 
static final String colAge="Age"; 
static final String colDept="Test"; 

static final String deptTable="Test1"; 
static final String colDeptID="TestID"; 
static final String colDeptName="TesttName"; 

static final String viewEmps="ViewPatient"; 


public DatabaseHelper(Context context) { 
    super(context, dbName, null,40); 

    // TODO Auto-generated constructor stub 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 

    db.execSQL("CREATE TABLE "+deptTable+" ("+colDeptID+ " INTEGER PRIMARY KEY , "+ 
      colDeptName+ " TEXT)"); 

    db.execSQL("CREATE TABLE "+employeeTable+" ("+colID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+ 
      colName+" TEXT, "+colAge+" Integer, "+colDept+" INTEGER NOT NULL ,FOREIGN KEY ("+colDept+") REFERENCES "+deptTable+" ("+colDeptID+"));"); 


    db.execSQL("CREATE TRIGGER fk_empdept_deptid " + 
      " BEFORE INSERT "+ 
      " ON "+employeeTable+ 

      " FOR EACH ROW BEGIN"+ 
      " SELECT CASE WHEN ((SELECT "+colDeptID+" FROM "+deptTable+" WHERE "+colDeptID+"=new."+colDept+") IS NULL)"+ 
      " THEN RAISE (ABORT,'Foreign Key Violation') END;"+ 
      " END;"); 

    db.execSQL("CREATE VIEW "+viewEmps+ 
      " AS SELECT "+employeeTable+"."+colID+" AS _id,"+ 
      " "+employeeTable+"."+colName+","+ 
      " "+employeeTable+"."+colAge+","+ 
      " "+deptTable+"."+colDeptName+""+ 
      " FROM "+employeeTable+" JOIN "+deptTable+ 
      " ON "+employeeTable+"."+colDept+" ="+deptTable+"."+colDeptID 
      ); 
    //Inserts pre-defined departments 
    InsertDepts(db); 

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // TODO Auto-generated method stub 

    db.execSQL("DROP TABLE IF EXISTS "+employeeTable); 
    db.execSQL("DROP TABLE IF EXISTS "+deptTable); 

    db.execSQL("DROP TRIGGER IF EXISTS dept_id_trigger"); 
    db.execSQL("DROP TRIGGER IF EXISTS dept_id_trigger22"); 
    db.execSQL("DROP TRIGGER IF EXISTS fk_empdept_deptid"); 
    db.execSQL("DROP VIEW IF EXISTS "+viewEmps); 
    onCreate(db); 
} 

void patient(patient emp) 
{ 


    SQLiteDatabase db= this.getWritableDatabase(); 


    ContentValues cv=new ContentValues(); 

    cv.put(colName, emp.getName()); 
    cv.put(colAge, emp.getAge()); 
    cv.put(colDept, emp.getDept()); 
    //cv.put(colDept,2); 

    db.insert(employeeTable, colName, cv); 
    db.close(); 


} 

int getEmployeeCount() 
{ 
    SQLiteDatabase db=this.getWritableDatabase(); 
    Cursor cur= db.rawQuery("Select * from "+employeeTable, null); 
    int x= cur.getCount(); 
    cur.close(); 
    return x; 
} 

Cursor getAllEmployees() 
{ 
    SQLiteDatabase db=this.getWritableDatabase(); 



    //Cursor cur= db.rawQuery("Select "+colID+" as _id , "+colName+", "+colAge+" from "+employeeTable, new String [] {}); 
    Cursor cur= db.rawQuery("SELECT * FROM "+viewEmps,null); 
    return cur; 

} 

Cursor getAllDepts() 
{ 
    SQLiteDatabase db=this.getReadableDatabase(); 
    Cursor cur=db.rawQuery("SELECT "+colDeptID+" as _id, "+colDeptName+" from "+deptTable,new String [] {}); 

    return cur; 
} 

void InsertDepts(SQLiteDatabase db) 
{ 
    ContentValues cv=new ContentValues(); 
     cv.put(colDeptID, 1); 
     cv.put(colDeptName, "XYZ"); 
     db.insert(deptTable, colDeptID, cv); 
     cv.put(colDeptID, 2); 
     cv.put(colDeptName, "ABC"); 
     db.insert(deptTable, colDeptID, cv); 
     cv.put(colDeptID, 3); 
     cv.put(colDeptName, "HIV"); 
     db.insert(deptTable, colDeptID, cv); 
     cv.put(colDeptID, 4); 
     cv.put(colDeptName, "HIV"); 
     db.insert(deptTable, colDeptID, cv); 
     db.insert(deptTable, colDeptID, cv); 

} 

public String GetDept(int ID) 
{ 
    SQLiteDatabase db=this.getReadableDatabase(); 

    String[] params=new String[]{String.valueOf(ID)}; 
    Cursor c=db.rawQuery("SELECT "+colDeptName+" FROM"+ deptTable+" WHERE "+colDeptID+"=?",params); 
    c.moveToFirst(); 
    int index= c.getColumnIndex(colDeptName); 
    return c.getString(index); 
} 

public Cursor getEmpByDept(String Dept) 
{ 
    SQLiteDatabase db=this.getReadableDatabase(); 
    String [] columns=new String[]{"_id",colName,colAge,colDeptName}; 
    Cursor c=db.query(viewEmps, columns, colDeptName+"=?", new String[]{Dept}, null, null, null); 
    return c; 
} 

public int GetDeptID(String Dept) 
{ 
    SQLiteDatabase db=this.getReadableDatabase(); 
    Cursor c=db.query(deptTable, new String[]{colDeptID+" as _id",colDeptName},colDeptName+"=?", new String[]{Dept}, null, null, null); 
    //Cursor c=db.rawQuery("SELECT "+colDeptID+" as _id FROM "+deptTable+" WHERE "+colDeptName+"=?", new String []{Dept}); 
    c.moveToFirst(); 
    return c.getInt(c.getColumnIndex("_id")); 

    } 

public int UpdateEmp(patient emp) 
{ 
    SQLiteDatabase db=this.getWritableDatabase(); 
    ContentValues cv=new ContentValues(); 
    cv.put(colName, emp.getName()); 
    cv.put(colAge, emp.getAge()); 
    cv.put(colDept, emp.getDept()); 
    return db.update(employeeTable, cv, colID+"=?", new String []{String.valueOf(emp.getID())}); 

} 

public void DeleteEmp(patient emp) 
{ 
    SQLiteDatabase db=this.getWritableDatabase(); 
    db.delete(employeeTable,colID+"=?", new String [] {String.valueOf(emp.getID())}); 
    db.close(); 



} 

}

這裏是日誌文件:

06-19 13:17:32.854: W/dalvikvm(873): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 
06-19 13:17:32.934: E/AndroidRuntime(873): FATAL EXCEPTION: main 
06-19 13:17:32.934: E/AndroidRuntime(873): java.lang.RuntimeException: Unable to start activity ComponentInfo{achira.test/achira.test.GridList}: java.lang.NullPointerException 
06-19 13:17:32.934: E/AndroidRuntime(873): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
06-19 13:17:32.934: E/AndroidRuntime(873): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
06-19 13:17:32.934: E/AndroidRuntime(873): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
06-19 13:17:32.934: E/AndroidRuntime(873): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
06-19 13:17:32.934: E/AndroidRuntime(873): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-19 13:17:32.934: E/AndroidRuntime(873): at android.os.Looper.loop(Looper.java:137) 
06-19 13:17:32.934: E/AndroidRuntime(873): at android.app.ActivityThread.main(ActivityThread.java:4424) 
06-19 13:17:32.934: E/AndroidRuntime(873): at java.lang.reflect.Method.invokeNative(Native Method) 
06-19 13:17:32.934: E/AndroidRuntime(873): at java.lang.reflect.Method.invoke(Method.java:511) 
06-19 13:17:32.934: E/AndroidRuntime(873): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
06-19 13:17:32.934: E/AndroidRuntime(873): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
06-19 13:17:32.934: E/AndroidRuntime(873): at dalvik.system.NativeStart.main(Native Method) 
06-19 13:17:32.934: E/AndroidRuntime(873): Caused by: java.lang.NullPointerException 
06-19 13:17:32.934: E/AndroidRuntime(873): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157) 
06-19 13:17:32.934: E/AndroidRuntime(873): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:231) 
06-19 13:17:32.934: E/AndroidRuntime(873): at achira.test.DatabaseHelper.getAllDepts(DatabaseHelper.java:126) 
06-19 13:17:32.934: E/AndroidRuntime(873): at achira.test.Utilities.ManageDeptSpinner(Utilities.java:13) 
06-19 13:17:32.934: E/AndroidRuntime(873): at achira.test.GridList.onCreate(GridList.java:35) 
06-19 13:17:32.934: E/AndroidRuntime(873): at android.app.Activity.performCreate(Activity.java:4465) 
06-19 13:17:32.934: E/AndroidRuntime(873): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
06-19 13:17:32.934: E/AndroidRuntime(873): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
06-19 13:17:32.934: E/AndroidRuntime(873): ... 11 more 
06-19 13:17:33.114: D/dalvikvm(873): GC_CONCURRENT freed 62K, 2% free 11769K/11975K, paused 5ms+60ms 
+0

這是非常糟糕的,因爲它允許[SQL注入(HTTP://en.wikipedia .ORG /維基/ SQL_injection#Incorrectly_filtered_escape_characters)。使用參數而不是連接字符串。 – m0skit0

+0

活動被正確提及。 – dreamhigh

+0

對不起,刪除了那個,我沒有看到整個堆棧跟蹤...哪一行是DatabaseHelper.java:126? – m0skit0

回答

1

這裏是它給你的NullPointerException行:

db = mContext.openOrCreateDatabase(mName, 0, mFactory, mErrorHandler); 

所以問題是mContext爲NULL。 你在執行super時提供一個上下文(context,dbName,null,40);

確保您在您的幫手構造提供有效的上下文:DatabaseHelper(上下文的背景下),NULL是無效的情況下;)

+0

還不行 – dreamhigh

+0

還是?你嘗試了什麼? :P – m0skit0

+0

@dreamhigh請在這裏發佈您的活動代碼。 –