一、整体工程图

二、activity_main.xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context=".MainActivity" >
  10. <ListView
  11. android:id="@+id/listView1"
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"
  14. android:layout_alignParentLeft="true"
  15. android:layout_alignParentTop="true" >
  16. </ListView>
  17.  
  18. </RelativeLayout>

三、add_name.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="240dp"
  4. android:layout_height="wrap_content"
  5. android:orientation="vertical" >
  6.  
  7. <TextView
  8. android:id="@+id/textView1"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:text="姓名:" />
  12.  
  13. <EditText
  14. android:id="@+id/username"
  15. android:layout_width="match_parent"
  16. android:layout_height="wrap_content"
  17. android:layout_marginBottom="4dp"
  18. android:layout_marginLeft="4dp"
  19. android:layout_marginRight="4dp"
  20. android:layout_marginTop="16dp"
  21. android:hint="username"
  22. android:inputType="textEmailAddress" />
  23.  
  24. <Button
  25. android:id="@+id/btnAdd"
  26. android:layout_width="match_parent"
  27. android:layout_height="wrap_content" android:text="确定">
  28. </Button>
  29.  
  30. </LinearLayout>

四、contentmenu.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android" >
  3.  
  4. <item
  5. android:id="@+id/menu_add"
  6. android:orderInCategory="100"
  7. android:showAsAction="never"
  8. android:title="添加">
  9. </item>
  10. <item
  11. android:id="@+id/menu_delete"
  12. android:orderInCategory="100"
  13. android:showAsAction="never"
  14. android:title="删除">
  15. </item>
  16. </menu>

五、MainActivity.java

  1. package com.example.loadermanagerdemo;
  2.  
  3. import android.net.Uri;
  4. import android.os.Bundle;
  5. import android.app.Activity;
  6. import android.app.AlertDialog;
  7. import android.app.LoaderManager;
  8. import android.app.LoaderManager.LoaderCallbacks;
  9. import android.content.ContentResolver;
  10. import android.content.ContentValues;
  11. import android.content.CursorLoader;
  12. import android.content.Loader;
  13. import android.database.Cursor;
  14. import android.util.Log;
  15. import android.view.ContextMenu;
  16. import android.view.LayoutInflater;
  17. import android.view.Menu;
  18. import android.view.MenuInflater;
  19. import android.view.MenuItem;
  20. import android.view.View;
  21. import android.view.ContextMenu.ContextMenuInfo;
  22. import android.widget.AdapterView.AdapterContextMenuInfo;
  23. import android.widget.Button;
  24. import android.widget.EditText;
  25. import android.widget.ListView;
  26. import android.widget.SimpleCursorAdapter;
  27. import android.widget.TextView;
  28.  
  29. public class MainActivity extends Activity {
  30. private LoaderManager manager;
  31. private ListView listview;
  32. private AlertDialog alertDialog;
  33. private SimpleCursorAdapter mAdapter;
  34. private final String TAG="main";
  35.  
  36. @Override
  37. protected void onCreate(Bundle savedInstanceState) {
  38. super.onCreate(savedInstanceState);
  39. setContentView(R.layout.activity_main);
  40. listview = (ListView) findViewById(R.id.listView1);
  41.  
  42. mAdapter = new SimpleCursorAdapter(MainActivity.this,
  43. android.R.layout.simple_list_item_1, null,
  44. new String[] { "name" }, new int[] { android.R.id.text1 },0);
  45. listview.setAdapter(mAdapter);
  46. manager = getLoaderManager();
  47. manager.initLoader(1000, null, callbacks);
  48.  
  49. registerForContextMenu(listview);
  50. }
  51.  
  52. @Override
  53. public void onCreateContextMenu(ContextMenu menu, View v,
  54. ContextMenuInfo menuInfo) {
  55. super.onCreateContextMenu(menu, v, menuInfo);
  56. MenuInflater inflater = getMenuInflater();
  57. inflater.inflate(R.menu.contentmenu, menu);
  58. }
  59.  
  60. @Override
  61. public boolean onContextItemSelected(MenuItem item) {
  62. AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
  63. .getMenuInfo();
  64. switch (item.getItemId()) {
  65. case R.id.menu_add:
  66. AlertDialog.Builder builder = new AlertDialog.Builder(
  67. MainActivity.this);
  68. final View view = LayoutInflater.from(MainActivity.this).inflate(
  69. R.layout.add_name, null);
  70. Button btnAdd = (Button) view.findViewById(R.id.btnAdd);
  71. btnAdd.setOnClickListener(new View.OnClickListener() {
  72.  
  73. @Override
  74. public void onClick(View v) {
  75. EditText etAdd = (EditText) view
  76. .findViewById(R.id.username);
  77. String name = etAdd.getText().toString();
  78. ContentResolver contentResolver = getContentResolver();
  79. ContentValues contentValues = new ContentValues();
  80. contentValues.put("name", name);
  81. Uri uri = Uri
  82. .parse("content://com.example.loadermanagerdemo.StudentContentProvider/student");
  83. Uri result = contentResolver.insert(uri, contentValues);
  84. /*if (result != null) {
  85. manager.restartLoader(1000, null, callbacks);
  86. }*/
  87. alertDialog.dismiss();
  88.  
  89. //Log.i(TAG, "添加数据成功,name="+name);
  90. }
  91. });
  92. builder.setView(view);
  93. alertDialog = builder.show();
  94. return true;
  95. case R.id.menu_delete:
  96. TextView tv = (TextView) info.targetView;
  97. String name = tv.getText().toString();
  98. Uri url = Uri
  99. .parse("content://com.example.loadermanagerdemo.StudentContentProvider/student");
  100. ContentResolver contentResolver = getContentResolver();
  101. String where = "name=?";
  102. String[] selectionArgs = { name };
  103. int count = contentResolver.delete(url, where, selectionArgs);
  104. /*if (count == 1) {
  105. manager.restartLoader(1000, null, callbacks);
  106. }*/
  107. //Log.i(TAG, "删除数据成功,name="+name);
  108. return true;
  109. default:
  110. return super.onContextItemSelected(item);
  111. }
  112.  
  113. }
  114.  
  115. private LoaderManager.LoaderCallbacks<Cursor> callbacks = new LoaderCallbacks<Cursor>() {
  116.  
  117. @Override
  118. public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
  119. Uri uri = Uri
  120. .parse("content://com.example.loadermanagerdemo.StudentContentProvider/student");
  121. CursorLoader loader = new CursorLoader(MainActivity.this, uri,
  122. null, null, null, null);
  123. Log.i("jltxgcy", "onCreateLoader被执行。");
  124. return loader;
  125. }
  126.  
  127. @Override
  128. public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
  129. mAdapter.swapCursor(cursor);
  130. //listview.setAdapter(mAdapter);
  131. Log.i("jltxgcy", "onLoadFinished被执行。");
  132. }
  133.  
  134. @Override
  135. public void onLoaderReset(Loader<Cursor> loader) {
  136. mAdapter.swapCursor(null);
  137. Log.i("jltxgcy", "onLoaderReset被执行。");
  138. }
  139. };
  140.  
  141. @Override
  142. public boolean onCreateOptionsMenu(Menu menu) {
  143. getMenuInflater().inflate(R.menu.main, menu);
  144. return true;
  145. }
  146.  
  147. }

六、StudentContentProvider.java

  1. package com.example.loadermanagerdemo;
  2.  
  3. import com.example.loadermanagerdemo.dbhelper.DbHelper;
  4.  
  5. import android.content.ContentProvider;
  6. import android.content.ContentUris;
  7. import android.content.ContentValues;
  8. import android.content.UriMatcher;
  9. import android.database.Cursor;
  10. import android.database.sqlite.SQLiteDatabase;
  11. import android.net.Uri;
  12. import android.util.Log;
  13.  
  14. public class StudentContentProvider extends ContentProvider {
  15. private DbHelper helper;
  16. private final String TAG = "main";
  17. private final static UriMatcher URI_MATCHAR = new UriMatcher(
  18. UriMatcher.NO_MATCH);
  19. private final static int STUDENT = 1;
  20. private final static int STUDENTS = 2;
  21. static {
  22.  
  23. URI_MATCHAR.addURI(
  24. "com.example.loadermanagerdemo.StudentContentProvider",
  25. "student", STUDENTS);
  26. URI_MATCHAR.addURI(
  27. "com.example.loadermanagerdemo.StudentContentProvider",
  28. "student/#", STUDENT);
  29. }
  30.  
  31. public StudentContentProvider() {
  32. }
  33.  
  34. @Override
  35. public int delete(Uri uri, String selection, String[] selectionArgs) {
  36. int count = -1;
  37. int flag = URI_MATCHAR.match(uri);
  38. SQLiteDatabase database = helper.getWritableDatabase();
  39. switch (flag) {
  40. case STUDENT:
  41. long stuid = ContentUris.parseId(uri);
  42. String where_value = "_id=?";
  43. String[] where_args = { String.valueOf(stuid) };
  44. count = database.delete("student", where_value, where_args);
  45. break;
  46.  
  47. case STUDENTS:
  48. count = database.delete("student", selection, selectionArgs);
  49. break;
  50. }
  51. Log.i(TAG, "---->>" + count);
  52. getContext().getContentResolver().notifyChange(uri, null);
  53. return count;
  54. }
  55.  
  56. @Override
  57. public String getType(Uri uri) {
  58. int flag = URI_MATCHAR.match(uri);
  59. switch (flag) {
  60. case STUDENT:
  61. return "vnd.android.cursor.item/student";
  62. case STUDENTS:
  63. return "vnd.android.cursor.dir/students";
  64. }
  65. return null;
  66. }
  67.  
  68. @Override
  69. public Uri insert(Uri uri, ContentValues values) {
  70. int flag = URI_MATCHAR.match(uri);
  71. SQLiteDatabase database = helper.getWritableDatabase();
  72. Uri returnUri = null;
  73.  
  74. if (STUDENTS == flag) {
  75. long id = database.insert("student", null, values);
  76. returnUri = ContentUris.withAppendedId(uri, id);
  77. }
  78. Log.i(TAG, "---->>" + returnUri.toString());
  79. getContext().getContentResolver().notifyChange(uri, null);
  80. return returnUri;
  81. }
  82.  
  83. @Override
  84. public boolean onCreate() {
  85. helper = new DbHelper(getContext());
  86. return false;
  87. }
  88.  
  89. @Override
  90. public Cursor query(Uri uri, String[] projection, String selection,
  91. String[] selectionArgs, String sortOrder) {
  92. Cursor cursor = null;
  93. SQLiteDatabase database=helper.getReadableDatabase();
  94. int flag = URI_MATCHAR.match(uri);
  95. switch (flag) {
  96. case STUDENTS:
  97. cursor=database.query(true, "student", null, selection, selectionArgs, null, null, null, null);
  98. break;
  99.  
  100. case STUDENT:
  101. long stuid=ContentUris.parseId(uri);
  102. String where_value="_id=?";
  103. String[] where_args={String.valueOf(stuid)};
  104. cursor=database.query(true, "student", null, where_value, where_args, null, null, null, null);
  105. break;
  106. }
  107. cursor.setNotificationUri(getContext().getContentResolver(), uri);
  108. return cursor;
  109. }
  110.  
  111. @Override
  112. public int update(Uri uri, ContentValues values, String selection,
  113. String[] selectionArgs) {
  114. int count = -1;
  115. int flag = URI_MATCHAR.match(uri);
  116. SQLiteDatabase database = helper.getWritableDatabase();
  117. switch (flag) {
  118. case STUDENTS:
  119. count = database
  120. .update("student", values, selection, selectionArgs);
  121. break;
  122.  
  123. case STUDENT:
  124. long stuid = ContentUris.parseId(uri);
  125. String where_value = "_id=?";
  126. String[] where_args = { String.valueOf(stuid) };
  127. count = database.update("student", values, where_value, where_args);
  128. break;
  129. }
  130. getContext().getContentResolver().notifyChange(uri, null);
  131. return count;
  132. }
  133.  
  134. }

七、DbHelper.java

  1. package com.example.loadermanagerdemo.dbhelper;
  2.  
  3. import android.content.ContentValues;
  4. import android.content.Context;
  5. import android.database.sqlite.SQLiteDatabase;
  6. import android.database.sqlite.SQLiteOpenHelper;
  7.  
  8. public class DbHelper extends SQLiteOpenHelper {
  9.  
  10. private static String name="mydb.db";
  11. private static int version=1;
  12. public DbHelper(Context context) {
  13. super(context, name, null, version);
  14. }
  15.  
  16. @Override
  17. public void onCreate(SQLiteDatabase database) {
  18. String sql="Create table student(_id integer primary key autoincrement,name varchar(64))";
  19. database.execSQL(sql);
  20. ContentValues values=new ContentValues();
  21. values.put("name", "Jack");
  22. database.insert("student", null, values);
  23. }
  24.  
  25. @Override
  26. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  27. // TODO Auto-generated method stub
  28.  
  29. }
  30.  
  31. }

八、详解

只要开启程序,就会调用StudentContentProvider中的onCreate方法,然后MainActivity中ContentResolver操作StudentContentProvider类,StudentContentProvider操作DbHelper类。

数据库部分内容请看http://www.w3school.com.cn/sql/sql_create_table.asp

       insert into Persons VALUES (1,'Gates', 'Bill', 'Xuanwumen 10', 'Beijing')。
       主键为NULL,代表自增长。对应到Android的SQL语句就变成字符串了。
        manager.initLoader(1000, null, callbacks)调用了onCreateLoader。
        Loader实现了异步加载,只要想StudentContentProvider插入数据,就会调用onLoadFinished更新了Cursor,通过mAdapter.swapCursor(cursor)更新了Listview。如果不是Listview,那么此处也是进行更新UI操作,只不过不能向刚才用一句程序mAdapter.swapCursor(cursor)就搞定。
        查询Cursor变化是异步的,在有数据插入,更新,删除的地方要加上getContext().getContentResolver().notifyChange(uri, null);
        如果退出Activity,那么会调用onLoaderReset,清空cursor。
        

Sqlite ContentProvider Loader 上下文 对话框的更多相关文章

  1. Android基础总结(三)SQLite,ListView,对话框

    测试 黑盒测试 测试逻辑业务 白盒测试 测试逻辑方法 根据测试粒度 方法测试:function test 单元测试:unit test 集成测试:integration test 系统测试:syste ...

  2. Android 存储(本地存储 SD卡存储 SharedPreference SQLite ContentProvider)

    本文出自:http://blog.csdn.net/dt235201314/article/details/73176149 源码下载欢迎Star(updating):https://github.c ...

  3. Android学习笔记总结

    第一步: Android(1) - 在 Windows 下搭建 Android 开发环境,以及 Hello World 程序 搭建 Android 的开发环境,以及写一个简单的示例程序 · 在 Win ...

  4. 19、android面试题整理(自己给自己充充电吧)

    (转载,出处丢失,请原作者原谅,如有意见,私信我我会尽快删除本文) JAVA 1.GC是什么? 为什么要有GC?GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问 ...

  5. Java 面试/笔试题神整理 [Java web and android]

    Java 面试/笔试题神整理 一.Java web 相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并 ...

  6. 【转】 71道经典Android面试题和答案,重要知识点都包含了

    ,,面试题1.        下列哪些语句关于内存回收的说明是正确的? (b ) A. 程序员必须创建一个线程来释放内存  B.内存回收程序负责释放无用内存   C.内存回收程序允许程序员直接释放内存 ...

  7. Android面试总结 (转)

    1. 下列哪些语句关于内存回收的说明是正确的? (b) A. 程序员必须创建一个线程来释放内存 B. 内存回收程序负责释放无用内存 C. 内存回收程序允许程序员直接释放内存 D. 内存回收程序可以在指 ...

  8. 经典71道Android试题及答案

    本文为开发者奉献了70道经典Android面试题加答案--重要知识点几乎都涉及到了,你还等啥,赶紧收藏吧!! 1. 下列哪些语句关于内存回收的说明是正确的? (b) A. 程序员必须创建一个线程来释放 ...

  9. android基础小结

    (注:此小结文档在全屏模式下观看效果最佳) 2016年3月1日,正式开始了我的android学习之路. 最最开始的,当然是学习怎样搭载环境了,然而苦逼的我在win10各种坑爹的指引下还是安装了一个星期 ...

随机推荐

  1. 基于Visual C++2013拆解世界五百强面试题--题16-进制分析

    清写出下列代码的输出内容 #include <stdio.h> int main() { int a = -1, b = -12, c = -123, d = -1234; printf( ...

  2. VS2008编译iconv静态链接库

    iconv是将一种编码格式转换为还有一种编码格式的开源库,比如能够把Windows环境下通用的ASCii(中文是GB2312)编码转换为国际通用的Unicode编码 iconv最新版本号仅仅支持Min ...

  3. JavaScript 数字相关的转换和方法

    类型判断 isNaN - 是否是 NaN(Not a Number).主要用来判断 NaN 是否是 NaN,因为 NaN == NaN 是 false. isNaN(NaN);       // tr ...

  4. CSS的display、hover、overflow、&copy(版权符号)、borer-radius(边框圆角)

    一.display: none 隐藏 block显示     visibility:hidden隐藏 visible显示 display:none和visibility:hidden这两个属性对应的值 ...

  5. [译]SSRS 报表版本控制

    问题 如今商务智能应用广泛,对我们的商业愈加重要. 对新报表和的各种需求不断攀升. 自 SQL Server 2008 R2的 Reporting Services (SSRS) 开始,微软视图为减轻 ...

  6. 详解虚拟机(windows)下搭建SVN服务器

    安装前的准备 1.虚拟机的用户名最好是英文 2.严格按照步骤做,否则有可能不成功 3.如果安装失败,在虚拟机下的控制板完全下载VisualSVN-Server-2.7.7,重新安装 软件下载地址: h ...

  7. C - N皇后问题(搜索)

    Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对于给定的N,求出有多少种合 ...

  8. JS日历控件

    <input type="text" id="st" name="st" onclick="return Calendar( ...

  9. JDBC_获取插入记录的主键值

    <span style="font-size:24px;">package src.com.JDBC2DAO.java; import static org.junit ...

  10. Recursive Depth first search graph(adj matrix)

    1 深度优先遍历邻接矩阵 1 邻接矩阵初始化 2 访问数组初始化 3 深度优先遍历邻接矩阵图 算法如下: bool MGraph[128][128]; bool visit[128]; int vex ...