一、整体工程图

二、activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
</ListView> </RelativeLayout>

三、add_name.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="240dp"
android:layout_height="wrap_content"
android:orientation="vertical" > <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名:" /> <EditText
android:id="@+id/username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_marginTop="16dp"
android:hint="username"
android:inputType="textEmailAddress" /> <Button
android:id="@+id/btnAdd"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:text="确定">
</Button> </LinearLayout>

四、contentmenu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item
android:id="@+id/menu_add"
android:orderInCategory="100"
android:showAsAction="never"
android:title="添加">
</item>
<item
android:id="@+id/menu_delete"
android:orderInCategory="100"
android:showAsAction="never"
android:title="删除">
</item>
</menu>

五、MainActivity.java

package com.example.loadermanagerdemo;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView; public class MainActivity extends Activity {
private LoaderManager manager;
private ListView listview;
private AlertDialog alertDialog;
private SimpleCursorAdapter mAdapter;
private final String TAG="main"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView) findViewById(R.id.listView1); mAdapter = new SimpleCursorAdapter(MainActivity.this,
android.R.layout.simple_list_item_1, null,
new String[] { "name" }, new int[] { android.R.id.text1 },0);
listview.setAdapter(mAdapter);
manager = getLoaderManager();
manager.initLoader(1000, null, callbacks); registerForContextMenu(listview);
} @Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.contentmenu, menu);
} @Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
.getMenuInfo();
switch (item.getItemId()) {
case R.id.menu_add:
AlertDialog.Builder builder = new AlertDialog.Builder(
MainActivity.this);
final View view = LayoutInflater.from(MainActivity.this).inflate(
R.layout.add_name, null);
Button btnAdd = (Button) view.findViewById(R.id.btnAdd);
btnAdd.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
EditText etAdd = (EditText) view
.findViewById(R.id.username);
String name = etAdd.getText().toString();
ContentResolver contentResolver = getContentResolver();
ContentValues contentValues = new ContentValues();
contentValues.put("name", name);
Uri uri = Uri
.parse("content://com.example.loadermanagerdemo.StudentContentProvider/student");
Uri result = contentResolver.insert(uri, contentValues);
/*if (result != null) {
manager.restartLoader(1000, null, callbacks);
}*/
alertDialog.dismiss(); //Log.i(TAG, "添加数据成功,name="+name);
}
});
builder.setView(view);
alertDialog = builder.show();
return true;
case R.id.menu_delete:
TextView tv = (TextView) info.targetView;
String name = tv.getText().toString();
Uri url = Uri
.parse("content://com.example.loadermanagerdemo.StudentContentProvider/student");
ContentResolver contentResolver = getContentResolver();
String where = "name=?";
String[] selectionArgs = { name };
int count = contentResolver.delete(url, where, selectionArgs);
/*if (count == 1) {
manager.restartLoader(1000, null, callbacks);
}*/
//Log.i(TAG, "删除数据成功,name="+name);
return true;
default:
return super.onContextItemSelected(item);
} } private LoaderManager.LoaderCallbacks<Cursor> callbacks = new LoaderCallbacks<Cursor>() { @Override
public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
Uri uri = Uri
.parse("content://com.example.loadermanagerdemo.StudentContentProvider/student");
CursorLoader loader = new CursorLoader(MainActivity.this, uri,
null, null, null, null);
Log.i("jltxgcy", "onCreateLoader被执行。");
return loader;
} @Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
mAdapter.swapCursor(cursor);
//listview.setAdapter(mAdapter);
Log.i("jltxgcy", "onLoadFinished被执行。");
} @Override
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
Log.i("jltxgcy", "onLoaderReset被执行。");
}
}; @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

六、StudentContentProvider.java

package com.example.loadermanagerdemo;

import com.example.loadermanagerdemo.dbhelper.DbHelper;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log; public class StudentContentProvider extends ContentProvider {
private DbHelper helper;
private final String TAG = "main";
private final static UriMatcher URI_MATCHAR = new UriMatcher(
UriMatcher.NO_MATCH);
private final static int STUDENT = 1;
private final static int STUDENTS = 2;
static { URI_MATCHAR.addURI(
"com.example.loadermanagerdemo.StudentContentProvider",
"student", STUDENTS);
URI_MATCHAR.addURI(
"com.example.loadermanagerdemo.StudentContentProvider",
"student/#", STUDENT);
} public StudentContentProvider() {
} @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int count = -1;
int flag = URI_MATCHAR.match(uri);
SQLiteDatabase database = helper.getWritableDatabase();
switch (flag) {
case STUDENT:
long stuid = ContentUris.parseId(uri);
String where_value = "_id=?";
String[] where_args = { String.valueOf(stuid) };
count = database.delete("student", where_value, where_args);
break; case STUDENTS:
count = database.delete("student", selection, selectionArgs);
break;
}
Log.i(TAG, "---->>" + count);
getContext().getContentResolver().notifyChange(uri, null);
return count;
} @Override
public String getType(Uri uri) {
int flag = URI_MATCHAR.match(uri);
switch (flag) {
case STUDENT:
return "vnd.android.cursor.item/student";
case STUDENTS:
return "vnd.android.cursor.dir/students";
}
return null;
} @Override
public Uri insert(Uri uri, ContentValues values) {
int flag = URI_MATCHAR.match(uri);
SQLiteDatabase database = helper.getWritableDatabase();
Uri returnUri = null; if (STUDENTS == flag) {
long id = database.insert("student", null, values);
returnUri = ContentUris.withAppendedId(uri, id);
}
Log.i(TAG, "---->>" + returnUri.toString());
getContext().getContentResolver().notifyChange(uri, null);
return returnUri;
} @Override
public boolean onCreate() {
helper = new DbHelper(getContext());
return false;
} @Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Cursor cursor = null;
SQLiteDatabase database=helper.getReadableDatabase();
int flag = URI_MATCHAR.match(uri);
switch (flag) {
case STUDENTS:
cursor=database.query(true, "student", null, selection, selectionArgs, null, null, null, null);
break; case STUDENT:
long stuid=ContentUris.parseId(uri);
String where_value="_id=?";
String[] where_args={String.valueOf(stuid)};
cursor=database.query(true, "student", null, where_value, where_args, null, null, null, null);
break;
}
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
} @Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int count = -1;
int flag = URI_MATCHAR.match(uri);
SQLiteDatabase database = helper.getWritableDatabase();
switch (flag) {
case STUDENTS:
count = database
.update("student", values, selection, selectionArgs);
break; case STUDENT:
long stuid = ContentUris.parseId(uri);
String where_value = "_id=?";
String[] where_args = { String.valueOf(stuid) };
count = database.update("student", values, where_value, where_args);
break;
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
} }

七、DbHelper.java

package com.example.loadermanagerdemo.dbhelper;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; public class DbHelper extends SQLiteOpenHelper { private static String name="mydb.db";
private static int version=1;
public DbHelper(Context context) {
super(context, name, null, version);
} @Override
public void onCreate(SQLiteDatabase database) {
String sql="Create table student(_id integer primary key autoincrement,name varchar(64))";
database.execSQL(sql);
ContentValues values=new ContentValues();
values.put("name", "Jack");
database.insert("student", null, values);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub } }

八、详解

只要开启程序,就会调用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. AndroidStudio项目移植到Eclipse

    原文件结构: 在AndroidStudio中 main目录对应eclipse中的src目录 可以看看每个文件夹下的目录 没有src或者main这些文件夹的都可以删掉 我这里只有app下的东西是需要留着 ...

  2. _WSAStartup@8,该符号在函数 _main 中被引用

    int WSAStartup( __in WORD wVersionRequested, __out LPWSADATA lpWSAData ); WSAStartup 格  式: int PASCA ...

  3. Minimum Inversion Number(线段树求逆序数)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  4. IOS开发新手教程(一)-数据类型和运算符

    OC语法入门(一) 数据类型和运算符 1.1凝视 凝视和其它语言一样,同意单行 ,多行凝视,一份规范的代码里面须要有一些正式的凝视,例如以下凝视: /* 这是多行 凝视 */ //这是多行凝视 OC语 ...

  5. mysql基本总结

    创建数据库 creat table test( #整数通常使用int test_id int, #小数通常使用decimal test_price decimal, #普通文本通常使用,并使用Defa ...

  6. Python lambda和reduce函数

    看到一篇博文写lambda和reduce函数.笔者小痒了一下,用Python实现一下: #! /usr/bin/env python # -*-coding:utf-8-*- import time ...

  7. Ext JS学习第三天 我们所熟悉的javascript(二)

    •javascript之函数 •对于Ext开发者,我还是希望你能对javascript原生的东西非常了解.甚至熟练掌握运用.那么函数,无疑是非常重要的概念.首先在前面一讲,我们知道了函数也是一种数据类 ...

  8. 调用AnimateWindow API来实现弹出效果

    下面是实例的cs代码 public partial class frm_Main : Form { //使用Windows Api AnimateWindow [DllImport("use ...

  9. ServiceBase 类

    https://msdn.microsoft.com/zh-cn/library/System.ServiceProcess.ServiceBase%28v=vs.80%29.aspx 为将作为服务应 ...

  10. levelDB缓存实现

    leveldb的缓存机制 leveldb采用LRU机制, 利用键的哈希值前n位作为索引, 将要插入的键值对分派到指定的缓存区, 当缓存区的使用率大于总容量后, 优先淘汰最近最少使用的缓存, 独立的缓存 ...