Sqlite ContentProvider Loader 上下文 对话框
一、整体工程图
二、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。
Sqlite ContentProvider Loader 上下文 对话框的更多相关文章
- Android基础总结(三)SQLite,ListView,对话框
测试 黑盒测试 测试逻辑业务 白盒测试 测试逻辑方法 根据测试粒度 方法测试:function test 单元测试:unit test 集成测试:integration test 系统测试:syste ...
- Android 存储(本地存储 SD卡存储 SharedPreference SQLite ContentProvider)
本文出自:http://blog.csdn.net/dt235201314/article/details/73176149 源码下载欢迎Star(updating):https://github.c ...
- Android学习笔记总结
第一步: Android(1) - 在 Windows 下搭建 Android 开发环境,以及 Hello World 程序 搭建 Android 的开发环境,以及写一个简单的示例程序 · 在 Win ...
- 19、android面试题整理(自己给自己充充电吧)
(转载,出处丢失,请原作者原谅,如有意见,私信我我会尽快删除本文) JAVA 1.GC是什么? 为什么要有GC?GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问 ...
- Java 面试/笔试题神整理 [Java web and android]
Java 面试/笔试题神整理 一.Java web 相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并 ...
- 【转】 71道经典Android面试题和答案,重要知识点都包含了
,,面试题1. 下列哪些语句关于内存回收的说明是正确的? (b ) A. 程序员必须创建一个线程来释放内存 B.内存回收程序负责释放无用内存 C.内存回收程序允许程序员直接释放内存 ...
- Android面试总结 (转)
1. 下列哪些语句关于内存回收的说明是正确的? (b) A. 程序员必须创建一个线程来释放内存 B. 内存回收程序负责释放无用内存 C. 内存回收程序允许程序员直接释放内存 D. 内存回收程序可以在指 ...
- 经典71道Android试题及答案
本文为开发者奉献了70道经典Android面试题加答案--重要知识点几乎都涉及到了,你还等啥,赶紧收藏吧!! 1. 下列哪些语句关于内存回收的说明是正确的? (b) A. 程序员必须创建一个线程来释放 ...
- android基础小结
(注:此小结文档在全屏模式下观看效果最佳) 2016年3月1日,正式开始了我的android学习之路. 最最开始的,当然是学习怎样搭载环境了,然而苦逼的我在win10各种坑爹的指引下还是安装了一个星期 ...
随机推荐
- poj 3356 AGTC(线性dp)
题目链接:http://poj.org/problem?id=3356 思路分析:题目为经典的编辑距离问题,其实质为动态规划问题: 编辑距离问题定义:给定一个字符串source,可以对其进行复制,替换 ...
- java对象复制
一,a和b都指向同一个对象,改变其中一个另一个也会改变 package com.ciaos; class Human{ public Human(String string, int i) { // ...
- word中创建文本框
word中创建文本框 在插入中点击"文本框"选项卡,例如以下图所看到的: 手工加入自己想要的文本框格式,然后选择所创建的文本框,在工具栏处会发现多了一 ...
- .c和.h文件的区别(头文件与之实现文件的的关系~ )
.c和.h文件的区别 一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢 ...
- 【翻译自mos文章】oracle支持在RDBMS HOME 下的 符号链接( Symbolic Links)吗?
oracle支持在RDBMS HOME 下的 符号链接( Symbolic Links)吗? 參考原文: Does Oracle support Symbolic Links in the RDBMS ...
- 关于python 模块导入
如何将自己写的库加入到python的库路径中: 首先查看python包含的库路径,步骤如下: a.打开python命令界面 b.import sys c.sys.path 1.在python安 ...
- SharePoint2013切换账户身份登录设置
1. 打开Welcome.ascx文件:C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\TEMPLATE ...
- Xcode - 详解真机测试步骤
第一种从iOS9.0之后推出的免费开发者账号 1.注册开发者 * 注册Apple ID * 使用Apple ID登录苹果开发者中心,注册成为开发者 * 此过程为免费,只是为了让普通的Apple ID具 ...
- hibernate的常用配置
hibernate.cfg.xml的一些相关配置 <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Co ...
- 2015暑假acm短训小结
时间很快,短训已经结束,短短20天,心里有一些思绪想要记下. 收获: 从最近发的随笔中可以看出,做得最多的是搜索——Dfs,Bfs.对于搜索,如何描述状态,如何压缩状态,如何决定下一个结点,是否可以剪 ...