关于数据库与LoaderManager的联合使用,节流???。。。。。
生活随笔
收集整理的這篇文章主要介紹了
关于数据库与LoaderManager的联合使用,节流???。。。。。
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
public class MainActivity extends Activity {// 定義主機名,用以拼接Uri,Uri表明了內容提供的地址,外部應用通過Uri訪問內容提供者,來實現對數據的增刪改查private static final String AUTHORITY = "com.fishtosky.loaderthrottle";/** 本例中我們將自定義的一個數據庫通過內容提供者共享給其它的外部應用,使外部應用可以對數據庫中的內容進行 增刪改查的操作。* 定義一個類用于定義關于內容提供者和工作表的一些常量,該類實現了BaseColumns接口,表示將繼承該接口* _id和_icount兩列,我們無需再定義就會在表中創建出這兩個列*/public static class MainTable implements BaseColumns {// 構造函數私有化,不允許創建此類的實例private MainTable() {};// 定義表的名字public static final String TABLE_NAME = "main";// 定義這張表的uripublic static final Uri CONTENT_URI = Uri.parse("content://"+ AUTHORITY + "/main");// 定義表中某個條目(某行數據)的Uri的前面公共的部分,使用時我們還需要在后面添加條目的Idpublic static final Uri CONTENT_ID_URI_BASE = Uri.parse("content://"+ AUTHORITY + "/main");// 定義Uri的命名機制,/前面的部分是android系統定義的,不能改變,/后面的部分可以自定義任意字符串public static final String CONTENT_TYPE = "vnd.android.cursor.dir/com.fishtosky.throttle";// 定義某個條目的Uri的命名機制public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/com.fishtosky.throttle";// 定義默認的排序方式public static final String DEFAULT_SORT_ORDER = "data COLLATE LOCALIZED ASC";// 定義列的名字,本例中只有一列public static final String COLUM_NAME_DATA = "data";}/** 定義數據庫的幫助庫,用于創建數據庫和工作表*/public static class DatabaseHelper extends SQLiteOpenHelper {// 定義數據庫的名字的版本private static final String DATABASE_NAME = "loader_throttle.db";private static final int DATABASE_VERSION = 1;public DatabaseHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE " + MainTable.TABLE_NAME + " ("+ MainTable._ID + " INTEGER PRIMARY KEY,"+ MainTable.COLUM_NAME_DATA + " TEXT);");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {Log.w("TAG", "Upgrading database from version " + oldVersion+ " to " + newVersion + ", which will destroy all old data");// 版本升級時調用,刪除舊表,創建新表db.execSQL("DROP TABLE IF EXISTS notes");onCreate(db);}}/** 自定義內容提供者,通過它實現把數據庫共享給外部應用*/public static class SimpleProvider extends ContentProvider {// 定義一個集合,把從數據庫中選出的列映射到該集合中private Map<String, String> mNotesProjectionMap;// 定義Uri的匹配器,用于解析傳入的Uriprivate UriMatcher mUriMatcher;// 定義當Uri匹配時的返回碼// 匹配整個表時的返回碼private static final int MAIN = 1;// 匹配某一行時的返回碼private static final int MAIN_ID = 2;private DatabaseHelper mOpenHelper;public SimpleProvider() {// 為內容提供者注冊UrimUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);mUriMatcher.addURI(AUTHORITY, MainTable.TABLE_NAME, MAIN);// #表示通配符mUriMatcher.addURI(AUTHORITY, MainTable.TABLE_NAME + "/#", MAIN_ID);mNotesProjectionMap = new HashMap<String, String>();mNotesProjectionMap.put(MainTable._ID, MainTable._ID);mNotesProjectionMap.put(MainTable.COLUM_NAME_DATA,MainTable.COLUM_NAME_DATA);}@Overridepublic boolean onCreate() {// 創建數據庫和數據表mOpenHelper = new DatabaseHelper(getContext());return true;}/** 用于供外部應用從內容提供者中獲取數據*/@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// 使用Sql查詢語句構建的輔助類SQLiteQueryBuilder qb = new SQLiteQueryBuilder();qb.setTables(MainTable.TABLE_NAME);// 根據匹配Uri的返回碼來判定是查詢整個數據表,還是查詢某條數據switch (mUriMatcher.match(uri)) {case MAIN:// 查詢整個表qb.setProjectionMap(mNotesProjectionMap);break;case MAIN_ID:qb.setProjectionMap(mNotesProjectionMap);// 追加篩選條件qb.appendWhere(MainTable._ID + "=?");// 獲取查詢參數即所要查詢條目的IdselectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,new String[] { uri.getLastPathSegment() });break;default:throw new IllegalArgumentException("UnKnown Uri" + uri);}// 如果沒定義排序規則,則按照默認的規則進行排序if (TextUtils.isEmpty(sortOrder)) {sortOrder = MainTable.DEFAULT_SORT_ORDER;}// 獲取到可讀的數據庫SQLiteDatabase db = mOpenHelper.getReadableDatabase();Cursor c = qb.query(db, projection, selection, selectionArgs, null,null, sortOrder);// 監聽uri的變化c.setNotificationUri(getContext().getContentResolver(), uri);return c;}/** 返回對應Uri MIME類型用以驗證數據的合法性*/@Overridepublic String getType(Uri uri) {switch (mUriMatcher.match(uri)) {case MAIN:return MainTable.CONTENT_TYPE;case MAIN_ID:return MainTable.CONTENT_ITEM_TYPE;default:throw new IllegalArgumentException("UnKnown Uri" + uri);}}/** 用于外部應用向內容提供者中插入數據*/@Overridepublic Uri insert(Uri uri, ContentValues values) {// 只能插入到數據表中if (mUriMatcher.match(uri) != MAIN) {throw new IllegalArgumentException("UnKnown Uri" + uri);}if (values != null) {SQLiteDatabase db = mOpenHelper.getWritableDatabase();long row_Id = db.insert(MainTable.TABLE_NAME, null, values);// 如果插入成功,則插入行的Id存在if (row_Id > 0) {// ContentUris用于操作Uri路徑后面的Id部分Uri noteUri = ContentUris.withAppendedId(MainTable.CONTENT_ID_URI_BASE, row_Id);//必須設置對Uri的監聽,不然loader無法獲取到數據庫的更新,不能實現實時更新getContext().getContentResolver().notifyChange(noteUri, null);// 返回所插入條目的Urireturn noteUri;}}throw new SQLException("Failed to insert row into " + uri);}/** 用于外部應用刪除內容提供者中的數據*/@Overridepublic int delete(Uri uri, String where, String[] whereArgs) {SQLiteDatabase db = mOpenHelper.getWritableDatabase();String findWhere;int count = -1;switch (mUriMatcher.match(uri)) {case MAIN:count = db.delete(MainTable.TABLE_NAME, where, whereArgs);break;case MAIN_ID:// 組裝查詢條件findWhere = DatabaseUtils.concatenateWhere(MainTable._ID + "="+ ContentUris.parseId(uri), where);count = db.delete(MainTable.TABLE_NAME, findWhere, whereArgs);break;default:throw new IllegalArgumentException("Unknown URI " + uri);}getContext().getContentResolver().notifyChange(uri, null);return count;}@Overridepublic int update(Uri uri, ContentValues values, String where,String[] whereArgs) {SQLiteDatabase db = mOpenHelper.getWritableDatabase();String findWhere;int count = -1;switch (mUriMatcher.match(uri)) {case MAIN:count = db.update(MainTable.TABLE_NAME, values, where,whereArgs);break;case MAIN_ID:// 組裝查詢條件findWhere = DatabaseUtils.concatenateWhere(MainTable._ID + "="+ ContentUris.parseId(uri), where);count = db.update(MainTable.TABLE_NAME, values, findWhere,whereArgs);break;default:throw new IllegalArgumentException("Unknown URI " + uri);}getContext().getContentResolver().notifyChange(uri, null);return count;}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);FragmentManager fm = getFragmentManager();if (fm.findFragmentById(android.R.id.content) == null) {LoaderThrottleFragment frg = new LoaderThrottleFragment();fm.beginTransaction().add(android.R.id.content, frg).commit();}}public static class LoaderThrottleFragment extends ListFragment {private static final int POPULATE_ID = Menu.FIRST;private static final int CLEAR_ID = Menu.FIRST + 1;private SimpleCursorAdapter mAdapter;private AsyncTask<Void, Void, Void> mPopulatingTask;final String[] projection = new String[] { MainTable._ID,MainTable.COLUM_NAME_DATA };private LoaderCallbacks<Cursor> myLoader = new LoaderCallbacks<Cursor>() {@Overridepublic Loader<Cursor> onCreateLoader(int id, Bundle args) {CursorLoader c = new CursorLoader(getActivity(),MainTable.CONTENT_URI, projection, null,null, null);System.out.println("數據變化了嗎?");//最多每2秒更新一次c.setUpdateThrottle(2000);return c;}@Overridepublic void onLoadFinished(Loader<Cursor> loader, Cursor data) {System.out.println("數據準備完畢了嗎?"+data.getCount());mAdapter.swapCursor(data);if(isResumed()){setListShown(true);}else{setListShownNoAnimation(true);}}@Overridepublic void onLoaderReset(Loader<Cursor> loader) {mAdapter.swapCursor(null);}};@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);setEmptyText("No data. Select 'Populate' to fill with data from Z to A at a rate of 4 per second.");setHasOptionsMenu(true);mAdapter = new SimpleCursorAdapter(getActivity(),android.R.layout.simple_list_item_1, null,new String[] { MainTable.COLUM_NAME_DATA },new int[] { android.R.id.text1 }, 0);setListAdapter(mAdapter);setListShown(false);getLoaderManager().initLoader(111, null, myLoader);}@Overridepublic void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {super.onCreateOptionsMenu(menu, inflater);menu.add(Menu.NONE, POPULATE_ID, 0, "populate").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);menu.add(Menu.NONE, CLEAR_ID, 0, "clear").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case POPULATE_ID:addToDatabase();//testadd();return true;case CLEAR_ID:deleteData();return true;}return super.onOptionsItemSelected(item);}/*private void testadd() {ContentValues values = new ContentValues();values.put(MainTable.COLUM_NAME_DATA, "I am test string");Uri rowUri=getActivity().getContentResolver().insert(MainTable.CONTENT_URI, values);if(rowUri!=null){getLoaderManager().restartLoader(111, null, myLoader);}System.out.println("rowUri:"+rowUri.toString());}*/private void deleteData() {if (mPopulatingTask != null) {mPopulatingTask.cancel(false);mPopulatingTask = null;}AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {@Overrideprotected Void doInBackground(Void... params) {getActivity().getContentResolver().delete(MainTable.CONTENT_URI, null, null);return null;}};task.execute((Void[]) null);}private void addToDatabase() {// 如果異步任務不為空,則取消任務if (mPopulatingTask != null) {mPopulatingTask.cancel(false);mPopulatingTask = null;}// 開啟線程向數據庫中添加內容mPopulatingTask = new AsyncTask<Void, Void, Void>() {@Overrideprotected Void doInBackground(Void... params) {// 向數據庫中添加內容for (char c = 'z'; c >= 'a'; c--) {if (isCancelled()) {break;}StringBuilder sb = new StringBuilder("Data ");sb.append(c);ContentValues values = new ContentValues();values.put(MainTable.COLUM_NAME_DATA, sb.toString());Uri rowUri=getActivity().getContentResolver().insert(MainTable.CONTENT_URI, values);//System.out.println("rowUri:"+rowUri.toString());try {Thread.sleep(250);} catch (InterruptedException e) {e.printStackTrace();}}return null;}};// 使用系統默認的線程池來管理線程//mPopulatingTask.execute((Void[]) null);mPopulatingTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,(Void[]) null);//getLoaderManager().restartLoader(111, null, myLoader);}@Overridepublic void onListItemClick(ListView l, View v, int position, long id) {super.onListItemClick(l, v, position, id);Toast.makeText(getActivity(), "Item click:" + id, 0).show();}}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
- 370
- 371
- 372
- 373
- 374
- 375
- 376
- 377
- 378
- 379
- 380
- 381
- 382
- 383
- 384
- 385
- 386
- 387
- 388
- 389
- 390
- 391
- 392
- 393
- 394
- 395
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
- 370
- 371
- 372
- 373
- 374
- 375
- 376
- 377
- 378
- 379
- 380
- 381
- 382
- 383
- 384
- 385
- 386
- 387
- 388
- 389
- 390
- 391
- 392
- 393
- 394
- 395
在配置文件中注冊內容提供者
<provider android:name="com.fishtosky.loaderthrottle.MainActivity$SimpleProvider"android:authorities="com.fishtosky.loaderthrottle"></provider>總結
以上是生活随笔為你收集整理的关于数据库与LoaderManager的联合使用,节流???。。。。。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于使用AsyncTaskLoader的
- 下一篇: 关于LocalBroadcastMana