在特定文件夹android上创建sqlite数据库

And*_*shi 0 android listview sqliteopenhelper android-sqlite

嗨,我有一个与数据库有关的问题

在我的项目中,我需要在特定的文件夹中建立数据库,所以任何伙伴都可以告诉我哪里错了

此类在以下位置创建数据库 /data/data/package_folder/database_name

我想将其更改为 sdcard/database_folder/database_name

请检查我下面的代码

    package com.example.qrcode.data;
    public class LocalDatabase extends SQLiteOpenHelper {

    public static final int DATABASE_VERSION = 1;

    // database name
    public static final String DATABASE_NAME = "qrcode_database";

    // table name
    public static final String TABLE_NAME = "scan_result";

    // table field name
    public static final String COLUMN_ID = "id";
    public static final String COLUMN_NAME = "scan_url";

    public static final String SAVE_TABLE_NAME = "DEVICE";

    public static final String SAVE_COLUMN_ID = "ID";
    public static final String SAVE_COLUMN_NAME = "DEVICE_ID";
    public static final String SAVE_COLUMN_KEY = "KEY";
    public static final String SAVE_COLUMN_VALUE = "VALUE";

    public static final String CREATE_SCAN_TABLE = "CREATE TABLE" + " "
            + TABLE_NAME + "(" + COLUMN_ID + " "
            + "INTEGER primary key autoincrement," + COLUMN_NAME + " TEXT,"
            + ");";

    public static final String CREATE_SAVE_TABLE = "CREATE TABLE" + " "
            + SAVE_TABLE_NAME + "(" + SAVE_COLUMN_ID
            + "INTEGER PRIMERY KEY AUTOINCREMENT" + SAVE_COLUMN_NAME + " TEXT"
            + SAVE_COLUMN_KEY + " TEXT" + SAVE_COLUMN_VALUE + " TEXT" + ");";

    public LocalDatabase(Context context, String name, CursorFactory factory,
            int version) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub

        try {
            db.execSQL(CREATE_SCAN_TABLE);
            db.execSQL(CREATE_SAVE_TABLE);
        } catch (Exception r) {
            r.printStackTrace();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }

    public void addname(String name) {

        SQLiteDatabase database = this.getWritableDatabase();

        Log.i("path ", database.getPath());
        ContentValues values = new ContentValues();
        // values.put(COLUMN_ID, scan_id);
        values.put(COLUMN_NAME, name);
        @SuppressWarnings("unused")
        Long int1 = database.insert(TABLE_NAME, null, values);
        database.close();

    }

    public void add_device(String data,
            ArrayList<HashMap<String, String>> jsonlist) {

        SQLiteDatabase database = this.getWritableDatabase();

        for (HashMap<String, String> map : jsonlist) {

            ContentValues values = new ContentValues();
            values.put(SAVE_COLUMN_NAME, data);
            values.put(SAVE_COLUMN_KEY, map.get(SAVE_COLUMN_KEY));
            values.put(SAVE_COLUMN_VALUE, map.get(SAVE_COLUMN_VALUE));
            @SuppressWarnings("unused")
            Long int1 = database.insert(SAVE_TABLE_NAME, null, values);

        }
        database.close();

        /*
         * for(HashMap<String, String> map : mylist){ ContentValues cv = new
         * ContentValues(); cv.put(FILE_NAME, map.get(FILE_NAME)); cv.put(DESC,
         * map.get(DESC)); cv.put(UPLOADED_BY, map.get(DATE_UPLOADED));
         * cv.put(ACTION, map.get(FILE_NAME)); cv.put(ID, map.get(ID));
         * cv.put(FILE_URI, map.get(FILE_URI)); db.insert("tablename", null,
         * cv); }
         */

    }

    public List<String> getemp() {

        List<String> name_list = new ArrayList<String>();

        String selectQuery = "SELECT " + SAVE_COLUMN_NAME + " FROM "
                + SAVE_TABLE_NAME;

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

        if (cursor.moveToFirst()) {
            do {

                String name = cursor.getString(0);

                // Adding contact to list
                name_list.add(name);
            } while (cursor.moveToNext());
        }

        return name_list;

    }
}
Run Code Online (Sandbox Code Playgroud)

提前致谢

GrI*_*sHu 5

首先,您必须指定sdcard的路径。您可以通过创建如下字符串来做到这一点:

  public static final String  DATABASE_FILE_PATH = "/sdcard";
Run Code Online (Sandbox Code Playgroud)

但是你应该打电话

    Environment.getExternalStorageDirectory()   
Run Code Online (Sandbox Code Playgroud)

获取SD卡的根路径,并使用该路径创建数据库。之后,您可以根据需要创建数据库。

这是一个例子

public class DatabaseHelper
{ 
   private static final String TAG  ="DatabaseHelper";

  public static final String  DATABASE_FILE_PATH = Environment.getExternalStorageDirectory();

   // database name
public static final String DATABASE_NAME = "qrcode_database";

// table name
public static final String TABLE_NAME = "scan_result";

// table field name
public static final String COLUMN_ID = "id";
public static final String COLUMN_NAME = "scan_url";

public static final String SAVE_TABLE_NAME = "DEVICE";

public static final String SAVE_COLUMN_ID = "ID";
public static final String SAVE_COLUMN_NAME = "DEVICE_ID";
public static final String SAVE_COLUMN_KEY = "KEY";
public static final String SAVE_COLUMN_VALUE = "VALUE";

public static final String CREATE_SCAN_TABLE = "CREATE TABLE" + " "
        + TABLE_NAME + "(" + COLUMN_ID + " "
        + "INTEGER primary key autoincrement," + COLUMN_NAME + " TEXT,"
        + ");";

public static final String CREATE_SAVE_TABLE = "CREATE TABLE" + " "
        + SAVE_TABLE_NAME + "(" + SAVE_COLUMN_ID
        + "INTEGER PRIMERY KEY AUTOINCREMENT" + SAVE_COLUMN_NAME + " TEXT"
        + SAVE_COLUMN_KEY + " TEXT" + SAVE_COLUMN_VALUE + " TEXT" + ");";

private SQLiteDatabase      database;

public DatabaseHelper() 
{  
    try
    {
        database = SQLiteDatabase.openDatabase(DATABASE_FILE_PATH
            + File.separator + DATABASE_NAME, null,SQLiteDatabase.OPEN_READWRITE);
    }
    catch (SQLiteException ex)
    {
        Log.e(TAG, "error -- " + ex.getMessage(), ex);
        // error means tables does not exits
        createTables();
    }
    finally
    {
        DBUtil.safeCloseDataBase(database);
    }
}

private void createTables()
{
    database.execSQL(TRACKS_TABLE_CREATE);
    database.execSQL(TRACK_INFO_TABLE_CREATE);
}

public void close()
{
    DBUtil.safeCloseDataBase(database);
}

public SQLiteDatabase getReadableDatabase()
{
    database = SQLiteDatabase.openDatabase(DATABASE_FILE_PATH
            + File.separator + DATABASE_NAME, null,
            SQLiteDatabase.OPEN_READONLY);
    return database;
}

public SQLiteDatabase getWritableDatabase()
{
    database = SQLiteDatabase.openDatabase(DATABASE_FILE_PATH
            + File.separator + DATABASE_NAME, null,
            SQLiteDatabase.OPEN_READWRITE);
    return database;
} 
Run Code Online (Sandbox Code Playgroud)

最后,您必须在清单中设置权限,如下所示:

        android.permission.WRITE_EXTERNAL_STORAGE
Run Code Online (Sandbox Code Playgroud)

希望对您有帮助。

请享用。