2014-02-06 2 views
2

데이터베이스 용 클래스 하나와 여러 테이블 용 클래스를 여러 클래스로 만들었습니다. 여러 클래스를 사용할 때 데이터베이스 클래스 인스턴스를 사용할 때 작동하지만 동시에 사용할 수 있습니다. 데이터베이스 클래스 인스턴스를 테이블 클래스에 저장하고 컨트롤이 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 

    } 

} 

활동 클래스

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 예외가 발생했습니다. 불행히도 여기에 예외를 붙여 넣을 수 없습니다.

누구든지 해결하도록 도울 수 있습니까?

로그 캣

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

오류입니다. 따라서 데이터베이스 생성자에 전달하기 전에 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()); 

      } 
     }); 
    } 
} 

UPDATE 데이터베이스 클래스 데이터베이스 및 도우미로 작업 할 때마다

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

난 그냥 대답을 upadate. –

0

StockID & Stock_ID 두 가지 열 이름이다.

테이블을 만드는 동안 Stock_ID을 열로 사용하고 선택 쿼리를 실행하는 동안 StockID을 열로 사용하는 것은 실수입니다. 귀하의 검색어는

String select="Select Stock_ID from Stocktable"; 

이어야하며 귀하의 Context C1도 초기화해야합니다. 당신은

String select="Select Stock_ID from Stocktable"; 

String select="Select StockID from Stocktable"; 

를 교체하고 또한 Context C1를 초기화해야

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

이 시도했지만 여전히 제어가'getwritabledatabase'로 바뀌면 예외가 발생합니다 – Siva

+0

@Siva, 제 편집 된 답변을 확인하십시오. – user3264399

1

: 같은 StockTableContext 현재 통과 생성자를 만듭니다. 같은 StockTableContext 현재 통과 생성자 만들기 :

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

을 그리고 당신의 stockmanager 활동에이

StockTable st=new StockTable(this); 

를 추가합니다. 데이터베이스를 만드는에는 컨텍스트가 없습니다 ..

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

(C1)가 초기화되지 않은 : 당신이 StockTable를 인스턴스화 할 때

+0

@M D 나는 이것을 시도했지만 여전히 제어가 'getwritabledatabase'로 바뀌면 예외가 발생합니다. – Siva

+0

감사합니다. – Siva

0

,이 두 줄은 문제가 있습니다. 유효한 컨텍스트를 생성자에 전달하거나 "set"메소드를 사용한 다음 사용을 위해 데이터베이스를 인스턴스화하십시오.이처럼 :

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

내가 대체 할 :와

String select="Select StockID from Stocktable"; 

: 당신이 널 컨텍스트와 데이터베이스에 액세스하려고하기 때문에

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

답장을 보내 주셔서 감사합니다 Jim하지만 유효한 컨텍스트를 전달하는 방법 저는 안드로이드에 초보자입니다. 이것에 대해 더 자세히 설명해 주시겠습니까? '데이터베이스 d1 = 새 데이터베이스 (***); 'getapplicationcontext' 또는 그와 비슷한 것을 얻지 못합니다. – Siva

+0

나는 내 대답을 편집했다. 또한 당신의 활동은 onCreate에 다음 라인을 포함해야합니다 : d = new Database (this); - 다른 답변은 이것을 언급하지만 거기에서 일하고있는 귀하의 의견은 내가 그것이 잘못된 것처럼 보일지라도 그것은 그것이 맞는 것처럼 믿을 것입니다 ... – Jim

관련 문제