2014-02-06 32 views
2

我爲數據庫創建了一個類,爲表和多個活動創建了多個類classess當我在activity類中使用數據庫類實例時,一切正常,但同時當我使用數據庫類實例在表類中運行應用程序,並儘快控制去getwritabledatabase我收到異常和應用程序退出,下面是所有3類的代碼。在android中執行getwritabledatabase()時出錯

數據庫類。

public class Database extends SQLiteOpenHelper{ 

    private static String dbname="Manager"; 
    private static int dbversion=2; 
    SQLiteDatabase db; 

    public Database(Context context) { 

     super(context, dbname, null, dbversion); 
     // TODO Auto-generated constructor stub 
     db=this.getWritableDatabase(); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     StockTable st=new StockTable(); 
     db.execSQL(st.stocktable); 
     } 

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

    } 

} 

Activity類

public class stockmanager extends Activity{ 

    String getentry=null; 
    Database d=new Database(this); 
    StockTable st=new StockTable(); 


    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.stockmanager); 

    final Button AddStock=(Button) findViewById(R.id.button1); 
     final EditText entry=(EditText) findViewById(R.id.editText1); 
     final Button BroDetail=(Button) findViewById(R.id.button2); 

     AddStock.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       getentry=entry.getText().toString(); 
       d.db.insert(st.tablename, null,st.insert()); 


      } 
     }); 
       } 
} 

表類

public class StockTable { 

    Context c1; 
    Database d1=new Database(c1); 
    final String tablename="StockTable"; 
    private String column1="Stock_ID"; 
    private String column2="StockName"; 


    final String stocktable = "CREATE TABLE " + tablename + 
       " (" + column1+ " INTEGER PRIMARY KEY , " + column2 + " TEXT) "; 

    public ContentValues insert(){ 

String select="Select StockID from Stocktable"; 

d.db.execsql(select); 
     ContentValues cvi=new ContentValues(); 
     for(int i=0;i<=sm.getentry.length();i++) 
     { 
      cvi.put(column1, 1); 
      cvi.put(column2,sm.getentry); 
         } 

     return cvi; 
    } 

    public void delete(){ 


    } 

當控制進入數據庫類的getwritabledatabase從活動類則它正在執行,但是當從庫存表類控制進入後首先到數據庫類並執行getwritabledatabase發生異常,不幸的是我無法在這裏粘貼異常。

任何人都可以請幫我解決這個問題嗎?

logcat的

02-07 10:06:09.624: D/libEGL(10756): loaded /system/lib/egl/libEGL_genymotion.so 
02-07 10:06:09.628: D/(10756): HostConnection::get() New Host Connection established 0xb87f5e00, tid 10756 
02-07 10:06:09.720: D/libEGL(10756): loaded /system/lib/egl/libGLESv1_CM_genymotion.so 
02-07 10:06:09.748: D/libEGL(10756): loaded /system/lib/egl/libGLESv2_genymotion.so 
02-07 10:06:10.024: W/EGL_genymotion(10756): eglSurfaceAttrib not implemented 
02-07 10:06:10.044: E/OpenGLRenderer(10756): Getting MAX_TEXTURE_SIZE from GradienCache 
02-07 10:06:10.196: E/OpenGLRenderer(10756): Getting MAX_TEXTURE_SIZE from Caches::initConstraints() 
02-07 10:06:10.212: D/OpenGLRenderer(10756): Enabling debug mode 0 
02-07 10:07:17.328: W/EGL_genymotion(10756): eglSurfaceAttrib not implemented 
02-07 10:07:19.820: I/Choreographer(10756): Skipped 36 frames! The application may be doing too much work on its main thread. 
02-07 10:07:22.556: W/EGL_genymotion(10756): eglSurfaceAttrib not implemented 
02-07 10:07:22.788: I/Choreographer(10756): Skipped 44 frames! The application may be doing too much work on its main thread. 
02-07 10:07:28.064: D/dalvikvm(10756): GC_FOR_ALLOC freed 105K, 1% free 16944K/17072K, paused 37ms, total 40ms 
02-07 10:07:30.524: I/System.out(10756): asdfdw 
02-07 10:07:30.576: D/AndroidRuntime(10756): Shutting down VM 
02-07 10:07:30.612: W/dalvikvm(10756): threadid=1: thread exiting with uncaught exception (group=0xa4b6e648) 
02-07 10:07:30.652: E/AndroidRuntime(10756): FATAL EXCEPTION: main 
02-07 10:07:30.652: E/AndroidRuntime(10756): android.database.sqlite.SQLiteException: unknown error (code 0): Queries can be performed using SQLiteDatabase query or rawQuery methods only. 
02-07 10:07:30.652: E/AndroidRuntime(10756): at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:734) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1603) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at com.example.portfoliomanager.StockTable.insert(StockTable.java:43) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at com.example.portfoliomanager.stockmanager$1.onClick(stockmanager.java:36) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at android.view.View.performClick(View.java:4240) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at android.view.View$PerformClick.run(View.java:17721) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at android.os.Handler.handleCallback(Handler.java:730) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at android.os.Handler.dispatchMessage(Handler.java:92) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at android.os.Looper.loop(Looper.java:137) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at android.app.ActivityThread.main(ActivityThread.java:5103) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at java.lang.reflect.Method.invokeNative(Native Method) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at java.lang.reflect.Method.invoke(Method.java:525) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
02-07 10:07:30.652: E/AndroidRuntime(10756): at dalvik.system.NativeStart.main(Native Method) 
02-07 10:07:34.288: I/Process(10756): Sending signal. PID: 10756 SIG: 9 
02-07 10:07:36.624: D/libEGL(10871): loaded /system/lib/egl/libEGL_genymotion.so 
02-07 10:07:36.644: D/(10871): HostConnection::get() New Host Connection established 0xb87f5e70, tid 10871 
02-07 10:07:36.784: D/libEGL(10871): loaded /system/lib/egl/libGLESv1_CM_genymotion.so 
02-07 10:07:36.784: D/libEGL(10871): loaded /system/lib/egl/libGLESv2_genymotion.so 
02-07 10:07:37.104: W/EGL_genymotion(10871): eglSurfaceAttrib not implemented 
02-07 10:07:37.108: E/OpenGLRenderer(10871): Getting MAX_TEXTURE_SIZE from GradienCache 
02-07 10:07:37.132: E/OpenGLRenderer(10871): Getting MAX_TEXTURE_SIZE from Caches::initConstraints() 
02-07 10:07:37.132: D/OpenGLRenderer(10871): Enabling debug mode 0 
+0

請發表日誌 –

+0

@BirajZalavadia在這一刻,我沒有日誌所以不能張貼 – Siva

+0

運行項目,並得到日誌夥計。 –

回答

1

錯誤是因爲你試圖用空的上下文來訪問數據庫。所以你需要在傳遞給Database構造函數之前初始化c1。

我只是編輯您StockTable.java試試這個

import android.content.ContentValues; 
import android.content.Context; 

public class StockTable { 

    Context c1; 
    Database d1; 
    final String tablename = "StockTable"; 
    private String column1 = "Stock_ID"; 
    private String column2 = "StockName"; 

    final String stocktable = "CREATE TABLE " + tablename + " (" + column1 + " INTEGER PRIMARY KEY , " + column2 + " TEXT) "; 


    public StockTable(Context mContext){ 
     c1= mContext; 
     d1= new Database(c1); 
    } 
    public ContentValues insert() { 


     ContentValues cvi = new ContentValues(); 
     for (int i = 0; i <= sm.getentry.length(); i++) { 
      cvi.put(column1, 1); 
      cvi.put(column2, sm.getentry); 
     } 

     return cvi; 
    } 

    public void delete() { 

    } 
} 

如何使用?

public class stockmanager extends Activity { 

    String getentry = null; 
    Database d; 
    StockTable st; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.stockmanager); 

     d = new Database(this.getApplicationContext()); 
     st = new StockTable(this.getApplicationContext()); 

     final Button AddStock = (Button) findViewById(R.id.button1); 
     final EditText entry = (EditText) findViewById(R.id.editText1); 
     final Button BroDetail = (Button) findViewById(R.id.button2); 

     AddStock.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       getentry = entry.getText().toString(); 
       d.db.insert(st.tablename, null, st.insert()); 

      } 
     }); 
    } 
} 

更新數據庫類

public class Database extends SQLiteOpenHelper { 

    private static String dbname = "Manager"; 
    private static int dbversion = 2; 
    SQLiteDatabase db; 
    private Context mContext; 

    public Database(Context context) { 

     super(context, dbname, null, dbversion); 
     // TODO Auto-generated constructor stub 
     mContext = context; 
     db = this.getWritableDatabase(); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     StockTable st = new StockTable(mContext); 
     db.execSQL(st.stocktable); 
    } 

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

    } 

} 
+0

感謝您的回覆我現在不能嘗試,但會使用代碼並將發佈回覆。 – Siva

+0

我已經嘗試了您的建議,但現在在數據庫類中,我創建了股票表的對象正在提示輸入上下文,但是我應該輸入那裏,因爲數據庫類中沒有上下文。請幫助 – Siva

+0

我剛剛答覆了答案。 –

0

StockID & Stock_ID是兩個不同的列名。

在創建表格時,您使用的是Stock_ID作爲列,而在發射選擇查詢時,您使用的是StockID作爲列,這是您的錯誤。您的查詢應該是

String select="Select Stock_ID from Stocktable"; 

並且還初始化了您的Context C1。創建通過電流ContextStockTable像構造:

public StockTable(Context cxnt){ 
this.c1=cxnt; 
} 
+0

已經嘗試過這一點,但仍然當控制權進入'getwritabledatabase'我得到異常 – Siva

+0

@Siva,請檢查我編輯的答案。 – user3264399

1

此時應更換此

String select="Select StockID from Stocktable"; 

隨着

String select="Select Stock_ID from Stocktable"; 

而且還初始化你Context C1。創建通過電流ContextStockTable像構造:

public StockTable(Context cxnt){ 
this.c1=cxnt; 
d1=new Database(c1); 
} 

並添加此

StockTable st=new StockTable(this); 

到您的stockmanager活動。

+0

@M D我試過這個,但仍然當控制權轉到'getwritabledatabase'我得到異常 – Siva

+0

謝謝你一定會試一試。 – Siva

0

當你實例StockTable,這兩條線都出現了問題:

Context c1; 
Database d1=new Database(c1); 

C1未初始化..還有就是要在其中創建數據庫中沒有上下文。將有效的上下文傳遞給構造函數,或使用「set」方法,然後實例化數據庫以供使用。就像這樣:

public StockTable(Context context) { 
c1 = context; 
d1=new Database(c1); 
} 

而且我會代替:

String select="Select StockID from Stocktable"; 

有:

String select="Select "+ column1 + " from " + tablename; 
+0

感謝您的回覆吉姆,但如何通過一個有效的上下文我是一個新手android,你可以請解釋更多關於這也'數據庫d1 =新數據庫(***);'在'***'部分我沒有得到任何'getapplicationcontext'或類似的東西。 – Siva

+0

我編輯了我的答案。你的活動也應該在onCreate中有這一行:d = new Database(this); - 其他答案提到這一點,但你的評論,它在那裏工作,導致我相信,它是這樣,即使它看起來不正確... – Jim