package com.lenovo.seeplus.provider;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "seeplus.db";
public static final int DATABASE_VERSION = 1;
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exists " + Provider.UserColumns.TABLE_NAME + "("
+ Provider.UserColumns._ID + " integer primary key autoincrement,"
+ Provider.UserColumns.USERNAME + " text,"
+ Provider.UserColumns.BOOTH_STATUS + " int default 0,"
+ Provider.UserColumns.AVATAR + " blob,"
+ Provider.UserColumns.CURRENT_USER + " int default 0,"
+ Provider.UserColumns.PATH + " text,"
+ Provider.UserColumns.TIMESTAMPS + " long,"
+ Provider.UserColumns.SENDER + " text,"
+ Provider.UserColumns.MESSAGE + " text);");
db.execSQL("create table if not exists " + Provider.EventColumns.TABLE_NAME + "("
+ Provider.EventColumns._ID + " integer primary key autoincrement,"
+ Provider.EventColumns.USER_ID + " integer not null,"
+ Provider.EventColumns.TITLE + " text,"
+ Provider.EventColumns.DATE + " long,"
+ Provider.EventColumns.STARTTIME + " text,"
+ Provider.EventColumns.ENDTTIME + " text,"
+ Provider.EventColumns.LOCATION + " text);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists " + Provider.UserColumns.TABLE_NAME);
db.execSQL("drop table if exists " + Provider.EventColumns.TABLE_NAME);
onCreate(db);
}
}
package com.lenovo.seeplus.provider;
import android.net.Uri;
import android.provider.BaseColumns;
public class Provider {
public static final String AUTHORITY = "com.lenovo.seeplus";
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.lenovo.seeplus";
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.lenovo.seeplus";
public static final class UserColumns implements BaseColumns {
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/user");
public static final String TABLE_NAME = "user";
public static final String USERNAME = "username";
public static final String BOOTH_STATUS = "booth_status";
public static final String TIMESTAMPS = "timestamps";
public static final String MESSAGE = "message";
public static final String SENDER = "sender";
public static final String AVATAR = "avatar";
public static final String CURRENT_USER = "current_user";
public static final String PATH = "path";
}
public static final class EventColumns implements BaseColumns {
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/event");
public static final String TABLE_NAME = "event";
public static final String USER_ID = "userId";
public static final String TITLE = "title";
public static final String DATE = "date";
public static final String STARTTIME = "starttime";
public static final String ENDTTIME = "endtime";
public static final String LOCATION = "location";
}
}
package com.lenovo.seeplus.provider
import android.content.ContentProvider
import android.content.ContentUris
import android.content.ContentValues
import android.content.UriMatcher
import android.database.Cursor
import android.database.SQLException
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteQueryBuilder
import android.net.Uri
import android.text.TextUtils
import android.util.Log
import java.util.HashMap
public class UserProvider extends ContentProvider {
private static final String TAG = UserProvider.class.getSimpleName()
private static final int USER = 1
private static final int USER_ID = 2
private static final int EVENT = 3
private static final int EVENT_ID = 4
private static final UriMatcher uriMatcher
private static HashMap<String, String> mUserProjectionMap
private static HashMap<String, String> mEventProjectionMap
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH)
uriMatcher.addURI(Provider.AUTHORITY, "user", USER)
uriMatcher.addURI(Provider.AUTHORITY, "user/#", USER_ID)
// 这里要增加另一张表的匹配项
uriMatcher.addURI(Provider.AUTHORITY, "event", EVENT)
uriMatcher.addURI(Provider.AUTHORITY, "event/#", EVENT_ID)
// 保存所有表用到的字段
mUserProjectionMap = new HashMap<>()
mUserProjectionMap.put(Provider.UserColumns._ID, Provider.UserColumns._ID)
mUserProjectionMap.put(Provider.UserColumns.USERNAME, Provider.UserColumns.USERNAME)
mUserProjectionMap.put(Provider.UserColumns.MESSAGE, Provider.UserColumns.MESSAGE)
mUserProjectionMap.put(Provider.UserColumns.SENDER, Provider.UserColumns.SENDER)
mUserProjectionMap.put(Provider.UserColumns.AVATAR, Provider.UserColumns.AVATAR)
mUserProjectionMap.put(Provider.UserColumns.TIMESTAMPS, Provider.UserColumns.TIMESTAMPS)
mUserProjectionMap.put(Provider.UserColumns.CURRENT_USER, Provider.UserColumns.CURRENT_USER)
mUserProjectionMap.put(Provider.UserColumns.BOOTH_STATUS, Provider.UserColumns.BOOTH_STATUS)
mUserProjectionMap.put(Provider.UserColumns.PATH, Provider.UserColumns.PATH)
mEventProjectionMap = new HashMap<>()
mEventProjectionMap.put(Provider.EventColumns._ID, Provider.EventColumns._ID)
mEventProjectionMap.put(Provider.EventColumns.USER_ID, Provider.EventColumns.USER_ID)
mEventProjectionMap.put(Provider.EventColumns.TITLE, Provider.EventColumns.TITLE)
mEventProjectionMap.put(Provider.EventColumns.STARTTIME, Provider.EventColumns.STARTTIME)
mEventProjectionMap.put(Provider.EventColumns.ENDTTIME, Provider.EventColumns.ENDTTIME)
mEventProjectionMap.put(Provider.EventColumns.LOCATION, Provider.EventColumns.LOCATION)
mEventProjectionMap.put(Provider.EventColumns.DATE, Provider.EventColumns.DATE)
}
private DatabaseHelper dbHelper = null
@Override
public boolean onCreate() {
Log.i(TAG, "Provider Create")
dbHelper = new DatabaseHelper(getContext())
return true
}
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)) { // 这里也要增加匹配项
case USER:
case EVENT:
return Provider.CONTENT_TYPE
case USER_ID:
case EVENT_ID:
return Provider.CONTENT_ITEM_TYPE
default:
throw new IllegalArgumentException("Unknown URI " + uri)
}
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder()
String orderBy
switch (uriMatcher.match(uri)) { // 这里要对不同表的匹配结果做不同处理
case USER:
case USER_ID:
qb.setTables(Provider.UserColumns.TABLE_NAME)
// If no sort order is specified use the default
orderBy = sortOrder
break
case EVENT:
case EVENT_ID:
qb.setTables(Provider.EventColumns.TABLE_NAME)
// If no sort order is specified use the default
orderBy = sortOrder
break
default:
throw new IllegalArgumentException("Unknown URI " + uri)
}
switch (uriMatcher.match(uri)) {
case USER:
qb.setProjectionMap(mUserProjectionMap)
break
case EVENT:
qb.setProjectionMap(mEventProjectionMap)
break
case USER_ID:
qb.setProjectionMap(mUserProjectionMap)
qb.appendWhere(Provider.UserColumns._ID + "=" + uri.getPathSegments().get(1))
break
case EVENT_ID:
qb.setProjectionMap(mEventProjectionMap)
qb.appendWhere(Provider.EventColumns._ID + "=" + uri.getPathSegments().get(1))
break
default:
throw new IllegalArgumentException("Unknown URI " + uri)
}
// Get the database and run the query
SQLiteDatabase db = dbHelper.getReadableDatabase()
Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy)
// Tell the cursor what uri to watch, so it knows when its source data changes
c.setNotificationUri(getContext().getContentResolver(), uri)
return c
}
@Override
public Uri insert(Uri uri, ContentValues initialValues) {
ContentValues values
if (initialValues != null) {
values = initialValues
} else {
values = new ContentValues()
}
String tableName
switch (uriMatcher.match(uri)) { // 这里要对不同表的匹配结果做不同处理
case USER:
tableName = Provider.UserColumns.TABLE_NAME
break
case EVENT:
tableName = Provider.EventColumns.TABLE_NAME
break
default:
// Validate the requested uri
throw new IllegalArgumentException("Unknown URI " + uri)
}
SQLiteDatabase db = dbHelper.getWritableDatabase()
long rowId = db.insert(tableName, null, values)
if (rowId > 0) {
Uri noteUri = ContentUris.withAppendedId(uri, rowId)
getContext().getContentResolver().notifyChange(noteUri, null)
return noteUri
}
throw new SQLException("Failed to insert row into " + uri)
}
@Override
public int delete(Uri uri, String where, String[] whereArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase()
int count
switch (uriMatcher.match(uri)) { // 这里要对不同表的匹配结果做不同处理,注意下面用到的表名不要弄错了
case USER:
count = db.delete(Provider.UserColumns.TABLE_NAME, where, whereArgs)
break
case USER_ID:
String userId = uri.getPathSegments().get(1)
count = db.delete(Provider.UserColumns.TABLE_NAME, Provider.UserColumns._ID + "=" + userId
+ (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs)
break
case EVENT:
count = db.delete(Provider.EventColumns.TABLE_NAME, where, whereArgs)
break
case EVENT_ID:
String eventId = uri.getPathSegments().get(1)
count = db.delete(Provider.EventColumns.TABLE_NAME, Provider.EventColumns._ID + "=" + eventId
+ (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs)
break
default:
throw new IllegalArgumentException("Unknown URI " + uri)
}
getContext().getContentResolver().notifyChange(uri, null)
return count
}
@Override
public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase()
int count
switch (uriMatcher.match(uri)) { // 这里要对不同表的匹配结果做不同处理,注意下面用到的表名不要弄错了
case USER:
count = db.update(Provider.UserColumns.TABLE_NAME, values, where, whereArgs)
break
case USER_ID:
String userId = uri.getPathSegments().get(1)
count = db.update(Provider.UserColumns.TABLE_NAME, values, Provider.UserColumns._ID + "=" + userId
+ (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs)
break
case EVENT:
count = db.update(Provider.EventColumns.TABLE_NAME, values, where, whereArgs)
break
case EVENT_ID:
String eventId = uri.getPathSegments().get(1)
count = db.update(Provider.EventColumns.TABLE_NAME, values, Provider.EventColumns._ID + "=" + eventId
+ (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs)
break
default:
throw new IllegalArgumentException("Unknown URI " + uri)
}
getContext().getContentResolver().notifyChange(uri, null)
return count
}
}
关于A SQLiteConnection object for database ‘/data/dbstar/xxx.db’ was leaked! 的解决办法:及时释放Cursor和SQLiteDatabase对象。如下finally模块所示:
private long save2DB(String path) {
DatabaseHelper helper = new DatabaseHelper(this)
SQLiteDatabase db = helper.getReadableDatabase()
long userId = 0
try {
ContentValues values = new ContentValues()
values.put(Provider.UserColumns.USERNAME, username)
values.put(Provider.UserColumns.TIMESTAMPS, System.currentTimeMillis())
values.put(Provider.UserColumns.SENDER, sender)
values.put(Provider.UserColumns.MESSAGE, message)
values.put(Provider.UserColumns.AVATAR, bitmapBytes)
values.put(Provider.UserColumns.PATH, path)
db.execSQL("update " + Provider.UserColumns.TABLE_NAME + " set " + Provider.UserColumns.CURRENT_USER + "=0 where " + Provider.UserColumns.CURRENT_USER + "=1")
values.put(Provider.UserColumns.CURRENT_USER, 1)
userId = db.insert(Provider.UserColumns.TABLE_NAME, null, values)
long date = 0
switch (event_date) {
case "今天":
date = System.currentTimeMillis()
break
case "明天":
date = System.currentTimeMillis() + 24 * 60 * 60 * 1000
break
case "后天":
date = System.currentTimeMillis() + 24 * 60 * 60 * 1000 * 2
break
}
for (int i = 0
ContentValues cv = new ContentValues()
Event event = eventList.get(i)
Log.i(TAG, event.toString())
cv.put(Provider.EventColumns.USER_ID, userId)
cv.put(Provider.EventColumns.TITLE, event.getTitle())
cv.put(Provider.EventColumns.STARTTIME, event.getStarttime())
cv.put(Provider.EventColumns.DATE, date)
long eventId = db.insert(Provider.EventColumns.TABLE_NAME, null, cv)
Log.i(TAG, "eventId = " + eventId)
}
} catch (SQLException e) {
e.printStackTrace()
} finally {
if (db != null && db.isOpen()) {
db.close()
db = null
}
}
return userId
}
private void initEventList() {
DatabaseHelper helper = new DatabaseHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor = null;
try {
cursor = db.query(Provider.EventColumns.TABLE_NAME, null, Provider.EventColumns.USER_ID + "=?", new String[]{String.valueOf(mUserId)}, null, null, null);
if (cursor != null) {
eventList.clear();
while (cursor.moveToNext()) {
String title = cursor.getString(cursor.getColumnIndex(Provider.EventColumns.TITLE));
String startTime = cursor.getString(cursor.getColumnIndex(Provider.EventColumns.STARTTIME));
mEventDate = cursor.getLong(cursor.getColumnIndex(Provider.EventColumns.DATE));
Event event = new Event();
event.setTitle(title);
event.setStarttime(startTime);
eventList.add(event);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
if (db != null && db.isOpen()) {
db.close();
db = null;
}
}
}