从Android存储器中读取SQLITE数据库

4

我在Java应用程序中创建了一个sqlite数据库,并将其推送到我的Android设备上。我想读取这个数据库(也可能稍后写入它)。到目前为止,我找到的大多数教程都是在Android内部创建DB...

我不认为我需要覆盖SQLiteOpenHelper类的onCreate()和onUpdate()方法,对吗?此外,下面的教程中创建表格的部分,由于我已经有了自己的数据库。

你们知道任何教程、示例代码吗?

public class DatabaseHandler extends SQLiteOpenHelper {

    // All Static variables
    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "contactsManager";

    // Contacts table name
    private static final String TABLE_CONTACTS = "contacts";

    // Contacts Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";
    private static final String KEY_PH_NO = "phone_number";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                + KEY_PH_NO + " TEXT" + ")";
        db.execSQL(CREATE_CONTACTS_TABLE);
    }

    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);

        // Create tables again
        onCreate(db);
    }

我只需要打开我在内存中的数据库,对我的数据库执行一个SQL查询并获取结果。

1个回答

4

在使用数据库之前,你需要将它从assets文件夹中复制到应用程序的存储区域(或其他可访问的位置)中。无法直接使用.apk文件中的数据库。

以下是一个操作示例:

public class DBAdapter { 

// DB info 
public static final String MAIN_DATABASE_NAME = "yourDB"; 
public static String MAIN_DB_PATH = "/data/data/your.package.name/databases/"; 
public static final int MAIN_DATABASE_VERSION = 1; 

// database control 
private DatabaseHelper mDbHelper; 
private static SQLiteDatabase mDb; 
private static Context mCtx; 

private static class DatabaseHelper extends SQLiteOpenHelper { 
    DatabaseHelper(Context context, String dbname, int dbversion) { 
        super(context, dbname, null, dbversion); 
        if (checkDataBase(dbname)) { 
            openDataBase(dbname); 
        } else { 
            try { 
                this.getReadableDatabase(); 
                copyDataBase(dbname); 
                this.close(); 
                openDataBase(dbname); 
            } catch (IOException e) { 
                throw new Error("Error copying database"); 
            } 
            Toast.makeText(context, 
                    "Initial " + dbname + " database has been created", 
                    Toast.LENGTH_LONG).show(); 
        } 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    } 
} 

public DBAdapter(Context ctx) { 
    DBAdapter.mCtx = ctx; 
} 

public DBAdapter open(String dbname, int dbversion) throws SQLException { 
    mDbHelper = new DatabaseHelper(mCtx, dbname, dbversion); 
    mDb = mDbHelper.getWritableDatabase(); 
    return this; 
} 

public void close() { 
    mDbHelper.close(); 
} 

private static void copyDataBase(String dbname) throws IOException { 
    InputStream myInput = mCtx.getAssets().open(dbname); 
    String outFileName = MAIN_DB_PATH + dbname; 
    OutputStream myOutput = new FileOutputStream(outFileName); 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer)) > 0) { 
        myOutput.write(buffer, 0, length); 
    } 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 
} 

private static boolean checkDataBase(String dbname) { 
    SQLiteDatabase checkDB = null; 
    boolean exist = false; 
    try { 
        String db = MAIN_DB_PATH + dbname; 
        checkDB = SQLiteDatabase.openDatabase(db, null, 
                SQLiteDatabase.OPEN_READONLY); 
    } catch (SQLiteException e) { 
        Log.v("db log", "database does't exist"); 
    } 
    if (checkDB != null) { 
        exist = true; 
        checkDB.close(); 
    } 
    return exist; 
} 

private static void openDataBase(String dbname) throws SQLException { 
    String dbPath = MAIN_DB_PATH + dbname; 
    mDb = SQLiteDatabase.openDatabase(dbPath, null, 
            SQLiteDatabase.OPEN_READWRITE); 
} 
} 

这正是我所需要的。由于我是 Android 和 sqlite 的新手,所以有几个问题。为什么我需要 copyDataBase 方法?是为了防止数据库不可写之类的情况吗?此外,我对数据库的版本也不确定?我一直看到它是 1。但还是感谢您提供这些信息。 - Achilles
copyDataBase 方法将数据库从应用文件中提取出来,并复制到您的应用程序数据库目录中,以便您可以实际使用它。当您更改模式(或内容)时,您需要更改版本号。如果您在 onUpgrade 方法中编写代码,就可以更新您的数据库。 - Barak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接