2012-04-13 77 views
-1

我有一個問題,並絞盡腦汁,試圖弄清楚爲什麼它不會工作。 這裏是代碼「沒有找到表」Android SQLite問題

import java.io.*; 
import android.content.Context; 
import android.database.SQLException; 
import android.database.sqlite.*; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 


public class DataBaseHelper extends SQLiteOpenHelper 
{ 
    //The Android's default system path of your application database. 
    private static String DB_PATH = "/data/data/teamawesome.spots.namespac/databases/"; 

    private static String DB_NAME = "Final.db3"; 

    //private static String DB_TABLE = "Restaurant"; 

    public 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) 
{ 

} 

public String Alphabetical() 
{ 
    Cursor c = null; 
    c = (Cursor)myDataBase.query(DB_NAME, null, null, null, null, null, null); 
    String sql = "SELECT * FROM Restaurant"; 
    c = myDataBase.rawQuery(sql, null); 
    return c; 
} 

任何和所有的幫助表示讚賞。

謝謝

+3

發佈完整堆棧跟蹤。 – kosa 2012-04-13 22:00:33

+0

你能在sqlite瀏覽器或通過控制檯打開這個數據庫,看看.schema輸出什麼 – endryha 2012-04-13 22:02:26

+0

我不知道你在copyDataBase中要做什麼,但我建議你使用更標準化的方式與SQL數據庫交互:http://developer.android.com/guide/topics/data/data-storage.html#db – Heinrisch 2012-04-13 22:06:14

回答

1

我能夠實現數據庫幾乎沒有問題......我跟着這個例子:Database Management...這是入門的最好的例子。之後,有幾個更高級的例子(谷歌發現),幫助更多高級主題,如錯誤捕獲和更新。

2

在你onCreate方法你應該做的所有的東西在新的數據庫中創建表,如下所示:

@Override 
public void onCreate(SQLiteDatabase db) 
{ 
    db.execSql("create table if not exists Restaraunt (...)"); 
} 
0

如果正在複製數據庫,您應該使用SQLiteDatabase.NO_LOCALIZED_COLLATORS標誌也在openDatabase通話。這將導致LOCALIZED collat​​or不被創建。

您不能使用指定的標誌時,必須缺少使用語言環境創建的android-metadata表。然後,您正在複製一個沒有它的數據庫。