2015-01-15 46 views
-1

我已經創建了一個數據庫手動使用Sqlitebrowser其中包含5個列CellID,緯度,經度,地址和城市表Table1。然後我用下面的類來訪問數據庫:在Android的Sqlite數據庫執行查詢

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

    private static String DB_NAME = "sampleDb.db"; 

    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. 

    } 

我有一個名爲找到我執行下面的代碼鍵:

public void btn_Click(View arg){ 
    DatabaseHelper myDbHelper; 
    myDbHelper = new DatabaseHelper(this); 

    try { 

    myDbHelper.createDataBase(); 

    } catch (IOException ioe) { 

    throw new Error("Unable to create database"); 

    } 

    try { 

    myDbHelper.openDataBase(); 

    SQLiteDatabase db = myDbHelper.getReadableDatabase(); 
    String selectQuery = "select CellID from Table1 where _id='2'"; 
    Cursor cursor = db.rawQuery(selectQuery, null); 
    cursor.close(); 
     Toast.makeText(getApplicationContext(), ""+cursor.getInt(0), Toast.LENGTH_LONG).show(); 
    }catch(SQLException sqle){ 

    throw sqle; 

    } 
} 

我收到以下錯誤:

01-15 17:23:09.834: E/AndroidRuntime(2372): Caused by: android.database.sqlite.SQLiteException: no such table: Table1 (code 1): , while compiling: select CellID from Table1 where _id='2' 
01-15 17:23:09.834: E/AndroidRuntime(2372):  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
01-15 17:23:09.834: E/AndroidRuntime(2372):  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882) 
01-15 17:23:09.834: E/AndroidRuntime(2372):  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493) 
01-15 17:23:09.834: E/AndroidRuntime(2372):  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
01-15 17:23:09.834: E/AndroidRuntime(2372):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
01-15 17:23:09.834: E/AndroidRuntime(2372):  at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 
01-15 17:23:09.834: E/AndroidRuntime(2372):  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 
01-15 17:23:09.834: E/AndroidRuntime(2372):  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314) 
01-15 17:23:09.834: E/AndroidRuntime(2372):  at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253) 
01-15 17:23:09.834: E/AndroidRuntime(2372):  at com.example.sampledbapp.MainActivity.btn_Click(MainActivity.java:49) 
01-15 17:23:09.834: E/AndroidRuntime(2372):  ... 14 more 

請幫忙!!

回答

0

所以我要去ENLIGHT你所有你需要你的代碼如下:

public class DatabaseHelper extends SQLiteOpenHelper{ 

private static String DB_NAME = "sampleDb.db"; 

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); 
myDatabase = getWritableDatabase(); <-- important part 
this.myContext = context; 
} 

@Override 
public synchronized void close() { 

if(myDataBase != null) 
myDataBase.close(); 

super.close(); 

} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    put in here your Sql to generate your tables inside the database will be called if no 
    database exists yet on the device 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    this method doesn't needs to be implemented yet 
} 

public void yourSelectQuery(){ 
String selectQuery = "select CellID from Table1 where _id=2"; 
Cursor cursor = db.rawQuery(selectQuery, null); 
cursor.moveToFirst(); 
    Toast.makeText(getApplicationContext(), ""+cursor.getInt(0), Toast.LENGTH_LONG).show(); 
cursor.close(); 
} 

,並在其他類

public void btn_Click(View arg){ 
    DatabaseHelper myDbHelper; 
    myDbHelper = new DatabaseHelper(this); 
    myDbHelper.yourSelectQuery(); 
} 
+0

OFC你不應該做麪包了數據庫處理程序類的。 – tung 2015-01-15 19:58:10

+0

我認爲你不明白這個問題。我不想從我的程序中生成表格,因爲您已經提到過: public void onCreate(SQLiteDatabase db){ 在這裏放置您的Sql以在數據庫內部生成您的表格將被調用,如果沒有 數據庫存在設備 } – user3411639 2015-01-17 09:33:08

+0

我想在已經創建的sqlite數據庫上執行查詢。請幫助我。 – user3411639 2015-01-17 09:33:34