2012-04-13 41 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表。然后,您正在复制一个没有它的数据库。