打开sqlite数据库失败android

时间:2013-04-19 11:43:26

标签: android sqlite database-design

我有几个表要插入到数据库中,并为每个文件创建了单独的java类。我是sqllite的新手。 SO有以下疑问。请帮助您的专业知识

1)当我运行create和open database时,它会捕获异常,但是当我更改版本号时,它会正常运行。这个版本意味着什么?

2)对于新表的每次创建,我是否应该增加版本?

3)另外,如果我必须在同一个数据库中创建表,那么我必须在我创建的所有类中保持数据库名称,帮助名称相同吗?

4)我可以删除一个版本,以便我可以重复使用它们吗?还是完全丢弃这个数据库?那么我可以从一开始就重新创造一切吗?

5)最后在哪里可以看到数据库文件?许多论坛建议它将在data / ..文件夹中,但我的data / ..文件夹始终为空。

请分享您的专业知识和义务。

1 个答案:

答案 0 :(得分:1)

1)版本号表示数据库的较新版本,即对其架构的修改。

2)创建新表会更改数据库架构,因此您应该增加版本。

4)根据我的经验,您可以使用“adb uninstall your package”删除数据库,如果您有内容提供商,这将特别有用。卸载还会删除内容提供程序。 如果你想从一个给定的点重新启动,然后再将表添加到你的数据库并重新测试,直到你做对了,你就会进行adb uninstall ...并将你的起始数据库的副本放在你的项目资产文件夹中然后使用提供的代码,如果它不存在,则重新创建数据库。

5)您可以通过多种方式查看数据库文件。  在我的Windows 7平台上使用了2个独立程序; SQLite数据库浏览器2.0 b1和sqlitestudio。如果您正在使用eclipse,请添加插件SQLLIteManager,com.questoid.sqlitemanager_1.0.0.jar。

希望这有帮助。

这是我的dbhelper的源代码,如果它不存在,我会复制项目的数据库。

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.SQLiteOpenHelper;
import android.util.Log;

public class TDAdbHelper extends SQLiteOpenHelper {

     private static String DATABASE_PATH;
 private static final String DATABASE_NAME = "tda.db";
 private static final int DATABASE_VERSION = 1;
 private Context context;
 private SQLiteDatabase db;

 TDAdbHelper(Context context) {
  super(context, DATABASE_NAME, null, DATABASE_VERSION);
  this.context = context;
  String packageName = context.getPackageName();
  DATABASE_PATH = String.format("//data//data//%s//databases//", packageName);
  Log.i(this.getClass().toString(), "... before calling openDatabase ");
openDataBase();
  Log.i(this.getClass().toString(), "... after return openDatabase ");
 }

 @Override
 public void onCreate(SQLiteDatabase db) {
     Log.i(this.getClass().toString(), "... Starting TDAdb.onCreate ");
  TDAdb.onCreate(db);
 }

 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  TDAdb.onUpgrade(db, oldVersion, newVersion);
 }
 //Performing a database existence check
 private boolean checkDataBase() {
     Log.i(this.getClass().toString(), "... Starting checkDatabase ");
     SQLiteDatabase checkDb = null;
     try {
         String path = DATABASE_PATH + DATABASE_NAME;
         checkDb = SQLiteDatabase.openDatabase(path, null,
                       SQLiteDatabase.OPEN_READONLY);
     } catch (SQLException e) {
         Log.e(this.getClass().toString(), "Error while checking db");
     }
     //Android doesn’t like resource leaks, everything should 
     // be closed
     if (checkDb != null) {
         checkDb.close();
     }
     return checkDb != null;
 }

 //Method for copying the database
 private void copyDataBase() throws IOException {
     //Open a stream for reading from our ready-made database
     //The stream source is located in the assets
     Log.i(this.getClass().toString(), "... in copyDataBase ");
     InputStream externalDbStream = context.getAssets().open(DATABASE_NAME);

      //Path to the created empty database on your Android device
     String outFileName = DATABASE_PATH + DATABASE_NAME;

      //Now create a stream for writing the database byte by byte
     OutputStream localDbStream = new FileOutputStream(outFileName);

      //Copying the database
     byte[] buffer = new byte[1024];
     int bytesRead;
     while ((bytesRead = externalDbStream.read(buffer)) > 0) {
         localDbStream.write(buffer, 0, bytesRead);
     }
     //Don’t forget to close the streams
     localDbStream.close();
     externalDbStream.close();
 }
 //This piece of code will create a database if it’s not yet created
 public void createDataBase() {
     Log.i(this.getClass().toString(), "... in createDataBase ");
     boolean dbExist = checkDataBase();
     if (!dbExist) {
         this.getReadableDatabase();
         try {
             copyDataBase();
         } catch (IOException e) {
             Log.e(this.getClass().toString(), "Copying error");
             throw new Error("Error copying database!");
         }
     } else {
         Log.i(this.getClass().toString(), "Database already exists");
     }
 }

 public SQLiteDatabase openDataBase() throws SQLException {
     String path = DATABASE_PATH + DATABASE_NAME;
     Log.i(this.getClass().toString(), "Starting openDatabase " + path);
     if (db == null) {
        createDataBase();
        db = SQLiteDatabase.openDatabase(path, null,
             SQLiteDatabase.OPEN_READWRITE);
     }

     return db;  
}

}

请注意我在db.java中所做的修改

*

/*   private static final String DATABASE_CREATE =
      "CREATE TABLE if not exists " + CHAPTER_TABLE + " (" +
       KEY_ROWID + " integer PRIMARY KEY autoincrement," +
       COL_CHAPTER + "," +
       COL_CHAPTERTITLE + "," +
    //   KEY_CONTINENT + "," +
       " UNIQUE (" + COL_CHAPTER +"));"; */

     public static void onCreate(SQLiteDatabase db) {
          Log.i(LOG_TAG, "onCreate");
     }

     public static void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
      Log.w(LOG_TAG, "Upgrading database from version " + oldVersion + " to "
        + newVersion + ", which will destroy all old data");
      onCreate(db);
     }
}

*