官方实例代码:
https://developer.android.com/training/data-storage/sqlite#java
https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper
使用:
创建一个类,继承SQLiteOpenHelper
public class SQLiteDbHelp extends SQLiteOpenHelper {
定义好数据库的名字和版本号
public static final String DATABASE_NAME = "saved_recordings.db";
private static final int DATABASE_VERSION = 1;
实现下面的方法,构造中填入数据库名称和版本号.
public SQLiteDbHelp(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_ENTRIES);
}
/**
* 当数据库需要升级时调用。实现应使用此方法删除表,添加表或执行升级到新模式版本所需的任何其他操作。
*
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// db.execSQL(SQL_DELETE_ENTRIES);
// onCreate(db);
}
}
在onCreate方法中开始创建表和字段.官方文档中都有模板代码,把自己的字段替换即可。
/**
* 创建数据库和字段
*/
private static final String SQL_CREATE_ENTRIES =
"CREATE TABLE " + RecorderEntry.TABLE_NAME + " (" +
RecorderEntry._ID + " INTEGER PRIMARY KEY," +
RecorderEntry.COLUMN_NAME_RECORDER_NAME + " TEXT," +
RecorderEntry.COLUMN_NAME_FILE_PATH + " TEXT," +
RecorderEntry.COLUMN_NAME_RECORDER_LENGTH + " INTEGER," +
RecorderEntry.COLUMN_NAME_RECORDER_ADD_TIME + " INTEGER" + ")";
表的实体类
public static class RecorderEntry implements BaseColumns {
public static final String TABLE_NAME = "save_recorder";
public static final String COLUMN_NAME_RECORDER_NAME = "recorder_name";
public static final String COLUMN_NAME_FILE_PATH = "file_path";
public static final String COLUMN_NAME_RECORDER_LENGTH = "recorder_length";
public static final String COLUMN_NAME_RECORDER_ADD_TIME = "added_time";
}
现在数据库和表都已经创建好了。剩下的就是增删改查了。
- 曾
public long insertRecorder(String name, String path, long time, long length) {
SQLiteDatabase database = getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(RecorderEntry.COLUMN_NAME_RECORDER_NAME, name);
contentValues.put(RecorderEntry.COLUMN_NAME_FILE_PATH, path);
contentValues.put(RecorderEntry.COLUMN_NAME_RECORDER_ADD_TIME, time);
contentValues.put(RecorderEntry.COLUMN_NAME_RECORDER_LENGTH, length);
long id = database.insert(RecorderEntry.TABLE_NAME, null, contentValues);
return id;
}
如果id返回-1则插入失败。
- 删
public void deleteItem(int id) {
SQLiteDatabase database = getReadableDatabase();
database.delete(RecorderEntry.TABLE_NAME, RecorderEntry._ID + "=?", new String[]{String.valueOf(id)});
}
- 改
public void renameItem(RecorderItem item, String newName, String path) {
SQLiteDatabase database = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(RecorderEntry.COLUMN_NAME_RECORDER_NAME, newName);
values.put(RecorderEntry.COLUMN_NAME_FILE_PATH, path);
database.update(RecorderEntry.TABLE_NAME, values, RecorderEntry._ID + "=?", new String[]{String.valueOf(item.getId())});
}
- 查
public RecorderItem getRecorderItem(int position) {
SQLiteDatabase database = getReadableDatabase();
Cursor cursor = database.query(RecorderEntry.TABLE_NAME, PROJECTION, null, null, null, null, null);
cursor.moveToFirst();
if (cursor.moveToPosition(position)) {
RecorderItem item = new RecorderItem();
item.setId(cursor.getLong(cursor.getColumnIndex(RecorderEntry._ID)));
item.setLength(cursor.getLong(cursor.getColumnIndex(RecorderEntry.COLUMN_NAME_RECORDER_LENGTH)));
item.setTime(cursor.getLong(cursor.getColumnIndex(RecorderEntry.COLUMN_NAME_RECORDER_ADD_TIME)));
item.setName(cursor.getString(cursor.getColumnIndex(RecorderEntry.COLUMN_NAME_RECORDER_NAME)));
item.setPath(cursor.getString(cursor.getColumnIndex(RecorderEntry.COLUMN_NAME_FILE_PATH)));
cursor.close();
return item;
} else {
return null;
}
}
都是模板代码,把自己项目中的字段替换即可。
db文件存放位置
db文件默认存放在data/data/目录下。
如何改变目录的位置呢?
有两个方法。嗯.. 相当于是一个吧
先说先简单的实现 亲测有效。
/**
* 设置数据库路径
*
* @param context
*/
public static void setDBPath(Context context) {
//获取的是目录位置 这个随便了
File dataBaseFile = FileUtils.getTypeFile(context, "db2");
//后面的是数据库的名称
File dbFile = new File(dataBaseFile, SQLiteDbHelp.DATABASE_NAME);
SQLiteDatabase.openOrCreateDatabase(dbFile.getAbsolutePath(), null);
}
- 这个。。。
继承ContextWrapper 并重写下面的方法
public class SQLiteContext extends ContextWrapper {
public SQLiteContext(Context base) {
super(base);
}
@Override
public File getDatabasePath(String name) {
// String path1= SDCardUtil.getDiskFilePath(name);
// String dirPath=path1.replace(name,"");
//String dirPath= SDCardUtil.getInnerSDCardPath();
Log.d("fengxing", "getDatabasePath: " + FileUtils.getTypeFile(this, "db").getAbsolutePath());
// /storage/emulated/0/Android/data/com.picc.mcp.lifemobile/files/db
String dirPath = FileUtils.getTypeFile(this, "db") + File.separator;
Log.d("fengxing", "dirPath: " + dirPath);
// /storage/emulated/0/Android/data/com.picc.mcp.lifemobile/files/db/
/**
* 差别我就不说了
*/
String path = null;
File parentFile = new File(dirPath);
if (!parentFile.exists()) {
parentFile.mkdirs();
}
String parentPath = parentFile.getAbsolutePath();
if (parentPath.lastIndexOf("\\/") != -1) {
path = dirPath + File.separator + name;
} else {
path = dirPath + name;
}
File file = new File(path);
return file;
}
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) {
return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);
}
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) {
return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name).getAbsolutePath(), factory, errorHandler);
}
}
如何使用?
new SQLiteDbHelp(new SQLiteContext(context));
想要知道为什么,去看源码吧。
完整代码
public class SQLiteDbHelp extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "saved_recordings.db";
private static final int DATABASE_VERSION = 1;
private static final String COLUMN_COUNT = "count";
/**
* 创建数据库和字段
*/
private static final String SQL_CREATE_ENTRIES =
"CREATE TABLE " + RecorderEntry.TABLE_NAME + " (" +
RecorderEntry._ID + " INTEGER PRIMARY KEY," +
RecorderEntry.COLUMN_NAME_RECORDER_NAME + " TEXT," +
RecorderEntry.COLUMN_NAME_FILE_PATH + " TEXT," +
RecorderEntry.COLUMN_NAME_RECORDER_LENGTH + " INTEGER," +
RecorderEntry.COLUMN_NAME_RECORDER_ADD_TIME + " INTEGER" + ")";
/**
* 删除表
*/
private static final String SQL_DELETE_ENTRIES =
"DROP TABLE IF EXISTS " + RecorderEntry.TABLE_NAME;
/**
* 要查询的字段
*/
private static final String[] PROJECTION = new String[]{
RecorderEntry._ID,
RecorderEntry.COLUMN_NAME_FILE_PATH,
RecorderEntry.COLUMN_NAME_RECORDER_NAME,
RecorderEntry.COLUMN_NAME_RECORDER_ADD_TIME,
RecorderEntry.COLUMN_NAME_RECORDER_LENGTH
};
String sortOrder =
RecorderEntry.COLUMN_NAME_RECORDER_ADD_TIME + " DESC";
public static class RecorderEntry implements BaseColumns {
public static final String TABLE_NAME = "save_recorder";
public static final String COLUMN_NAME_RECORDER_NAME = "recorder_name";
public static final String COLUMN_NAME_FILE_PATH = "file_path";
public static final String COLUMN_NAME_RECORDER_LENGTH = "recorder_length";
public static final String COLUMN_NAME_RECORDER_ADD_TIME = "added_time";
}
public interface OnDataBaseChangeListener {
void onNewDatabaseEntryAdded();
void onDatabaseEntryRenamed();
}
private OnDataBaseChangeListener listener;
private static SQLiteDatabase INSTANCE;
private SQLiteContext mContext;
public SQLiteDatabase getInstance() {
if (INSTANCE == null) {
INSTANCE = new SQLiteDbHelp(mContext).getWritableDatabase();
}
return INSTANCE;
}
public SQLiteDbHelp(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.mContext = (SQLiteContext) context;
}
public String getDBPath() {
return mContext.getDatabasePath(DATABASE_NAME).getAbsolutePath();
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_ENTRIES);
}
/**
* 当数据库需要升级时调用。实现应使用此方法删除表,添加表或执行升级到新模式版本所需的任何其他操作。
*
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// db.execSQL(SQL_DELETE_ENTRIES);
// onCreate(db);
}
/**
* 当数据库需要降级时使用
*
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//onUpgrade(db, oldVersion, newVersion);
}
public void setOnDataBaseChangeListener(OnDataBaseChangeListener listener) {
this.listener = listener;
}
public List<RecorderItem> getRecorderItems() {
ArrayList<RecorderItem> list = new ArrayList<>();
SQLiteDatabase database = getReadableDatabase();
Cursor cursor = database.query(RecorderEntry.TABLE_NAME, PROJECTION, null, null, null, null, null);
while (cursor.moveToNext()) {
RecorderItem item = new RecorderItem();
item.setId(cursor.getLong(cursor.getColumnIndex(RecorderEntry._ID)));
item.setLength(cursor.getLong(cursor.getColumnIndex(RecorderEntry.COLUMN_NAME_RECORDER_LENGTH)));
item.setTime(cursor.getLong(cursor.getColumnIndex(RecorderEntry.COLUMN_NAME_RECORDER_ADD_TIME)));
item.setName(cursor.getString(cursor.getColumnIndex(RecorderEntry.TABLE_NAME)));
item.setPath(cursor.getString(cursor.getColumnIndex(RecorderEntry.COLUMN_NAME_FILE_PATH)));
cursor.close();
list.add(item);
}
return list;
}
private static final String SELECTION = RecorderEntry._ID + "=?";
public void getItemWithId(long id) {
SQLiteDatabase database = getReadableDatabase();
Cursor cursor = database.query(RecorderEntry.TABLE_NAME, PROJECTION, SELECTION, new String[]{String.valueOf(id)}, null, null, null);
cursor.close();
}
public RecorderItem getRecorderItem(int position) {
SQLiteDatabase database = getReadableDatabase();
Cursor cursor = database.query(RecorderEntry.TABLE_NAME, PROJECTION, null, null, null, null, null);
cursor.moveToFirst();
if (cursor.moveToPosition(position)) {
RecorderItem item = new RecorderItem();
item.setId(cursor.getLong(cursor.getColumnIndex(RecorderEntry._ID)));
item.setLength(cursor.getLong(cursor.getColumnIndex(RecorderEntry.COLUMN_NAME_RECORDER_LENGTH)));
item.setTime(cursor.getLong(cursor.getColumnIndex(RecorderEntry.COLUMN_NAME_RECORDER_ADD_TIME)));
item.setName(cursor.getString(cursor.getColumnIndex(RecorderEntry.COLUMN_NAME_RECORDER_NAME)));
item.setPath(cursor.getString(cursor.getColumnIndex(RecorderEntry.COLUMN_NAME_FILE_PATH)));
cursor.close();
return item;
} else {
return null;
}
}
public long insertRecorder(String name, String path, long time, long length) {
SQLiteDatabase database = getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(RecorderEntry.COLUMN_NAME_RECORDER_NAME, name);
contentValues.put(RecorderEntry.COLUMN_NAME_FILE_PATH, path);
contentValues.put(RecorderEntry.COLUMN_NAME_RECORDER_ADD_TIME, time);
contentValues.put(RecorderEntry.COLUMN_NAME_RECORDER_LENGTH, length);
long id = database.insert(RecorderEntry.TABLE_NAME, null, contentValues);
if (listener != null) {
listener.onNewDatabaseEntryAdded();
}
return id;
}
public void renameItem(RecorderItem item, String newName, String path) {
SQLiteDatabase database = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(RecorderEntry.COLUMN_NAME_RECORDER_NAME, newName);
values.put(RecorderEntry.COLUMN_NAME_FILE_PATH, path);
database.update(RecorderEntry.TABLE_NAME, values, RecorderEntry._ID + "=?", new String[]{String.valueOf(item.getId())});
}
public void deleteItem(int id) {
SQLiteDatabase database = getReadableDatabase();
database.delete(RecorderEntry.TABLE_NAME, RecorderEntry._ID + "=?", new String[]{String.valueOf(id)});
}
public int getCount() {
SQLiteDatabase database = getReadableDatabase();
String[] projection = {RecorderEntry._ID};
Cursor c = database.query(RecorderEntry.TABLE_NAME, projection, null, null, null, null, null);
int count = c.getCount();
c.close();
return count;
}
}
网友评论