2011-11-06 2 views
0

안드로이드를 사용하여 SQLite 데이터베이스를 쿼리하는 데 문제가 있습니다. 테이블에 "users"가 DB에 존재하지 않거나 "fname"열 이름이 존재하지 않지만 둘 다 존재한다는 오류가 계속 발생합니다.안드로이드 : 데이터베이스에 테이블이 없다고 주장하는 오류가 있지만

데이터베이스에서 인식 할 수있는 유일한 테이블은 android_metadata입니다.

public class DataBaseHelper extends SQLiteOpenHelper{ 

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

private static String DB_NAME = "CSLearnDB"; 

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; 
} 


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 { 

      this.close(); 
      copyDataBase(); 

     } catch (IOException e) { 

      throw new Error("Error copying database"); 

     } 
    } 

    this.close(); 

} 

/** 
* 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) { 

} 

public Cursor dbSelect(String table, String[] select){ 

    return myDataBase.query(table, select, null, null, null, null, null); 

} 

}

가 여기 내 홈페이지에서 onCreate 메소드의 코드입니다 : 어떤 도움이 정말 감사하겠습니다

public class Hello_AppActivity extends Activity { 


String tag = "Events"; 

/** Called when the activity is first created. */ 

@Override 
public void onCreate(Bundle savedInstanceState) { 



    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    DataBaseHelper 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; 

    } 



    ArrayList<String> results = new ArrayList<String>(); 

    results.add("TEST"); 

    String[] x = {"sname"}; 

    Cursor c = myDbHelper.dbSelect("users", x); 

    Spinner s1 = (Spinner) findViewById(R.id.spinner1); 



    if (c != null) { 

     if (c.moveToFirst()) { 
      do { 

       String firstName = c.getString(0); 

       results.add(firstName); 

       results.add("TEST 2"); 

      }while (c.moveToNext()); 
     } 
    }else{ 

    } 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, results); 

    s1.setAdapter(adapter); 

}

여기 DataBaseHelper 클래스 내 코드입니다. 감사.

답변

0

데이터베이스가 올바르게 복사되었는지 확인하고 확인하십시오. 테이블이 실제로 거기에 있다면, 내 생각 엔 빈 데이터베이스가 생각보다 먼저 생성되고 원하는 데이터베이스를 복사하지 않는 것입니다.

db를 쿼리하려면 명령 줄에서 sqlite3을 실행하고 sqlite3을 실행할 수 있어야합니다.

+0

새 테스트 데이터베이스가 만들어져 성공적으로 작동했습니다. 감사. – TrueWheel

0

왜 그렇게 확신할까요? SQLite 브라우저에서 데이터베이스 파일을 확인 했습니까?

실제로 테이블을 만들지 않은 것처럼 보입니다. 당신은 내 도우미의 onCreate() 방법에 넣어

sqlDB.execSQL("create table users (_id integer primary key autoincrement, fname text);"); 

같은 라인이 필요합니다,하지만 당신은 다른 곳에 배치 할 수 있습니다.

+0

안녕하세요, 귀하의 회신에 감사드립니다. 나는 그것을 SQLite 브라우저에서 검사했고 거기에있다. 테이블을 만들지 않은 이유는 SQLite Broswer를 사용하여 만든 데이터베이스에 이미 존재하기 때문입니다. – TrueWheel

관련 문제