Android文件存储(二)与ContentProvider
2016-06-26 20:28
316 查看
本篇介绍Android中的数据库SQLite,同时介绍Android中的四大组件中的ContentProvider
一:数据库的创建:
1.定义一个类继承SQLiteOpenHelper,重写其中的构造方法:
2.实例化该类,取得该类的实例:
3.查询该数据库中的Accout表:
当然可以使用命令行的工具查数据库:
命令台变成GBK编码:
chcp 936;
命令台变成UTF-8的编码:
chcp 96001;
改变文件的访问属性:
二:ContentProvier(内容提供者)与ContentResolver(内容解析者):
1.定义一个类继承ContentProvier,定义的位置是要暴露数据的项目中
2.在清单文件中配置一下:
3.内容提供者的设置:
4.在另一个项目中通过内容解析者来访问别的项目的数据:
一:数据库的创建:
1.定义一个类继承SQLiteOpenHelper,重写其中的构造方法:
public class MyOpenHelper extends SQLiteOpenHelper { public MyOpenHelper(Context context) { super(context, "Account.db", null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),money varchar(20))"); db.execSQL("insert into info(name,money) values(?,?)",new String[]{"张三","5000"}); db.execSQL("insert into info(name,money) values(?,?)",new String[]{"李四","3000"}); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
2.实例化该类,取得该类的实例:
MyOpenHelper helper= new MyOpenHelper(getApplicationContext()); SQLiteDatabase db= helper.getReadableDatabase();
3.查询该数据库中的Accout表:
Cursor cursor=db.query("info",null,null,null,null,null,null,null); if(cursor!=null&&cursor.getCount()>0){ while(cursor.moveToNext()){ String name= cursor.getString(cursor.getColumnIndex("name")); String money= cursor.getString(cursor.getColumnIndex("money")); System.out.println("name"+name+"-------"+"money"+money); } }
当然可以使用命令行的工具查数据库:
cd cmd adb shell cd /data/data ls //看包名 cd 完整的包名 cd databases sqlite3 Account.db select * from info;
命令台变成GBK编码:
chcp 936;
命令台变成UTF-8的编码:
chcp 96001;
改变文件的访问属性:
cd cmd adb shell cd /data/data ls //看包名 cd 完整的包名 cd databases chmod 777 //使的文件对于所有可使用可见
二:ContentProvier(内容提供者)与ContentResolver(内容解析者):
1.定义一个类继承ContentProvier,定义的位置是要暴露数据的项目中
2.在清单文件中配置一下:
<provider android:authorities="com.fuyunwang.provider" android:name=".AccountProvider" android:exported="true" > </provider>
3.内容提供者的设置:
public class AccountProvider extends ContentProvider { //定义常量 private static final int QUERYSUCCESS = 0; private static final int INSERTSUCCESS = 1; private static final int UPDATESUCCESS = 2; private static final int DELSUCCESS = 3; //首先定义一个Uri路径匹配器 private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH); //创建一个静态代码块 static { /*** * 第一个参数是清单文件的authority的值,第二个和第三个的值随意指定,此时的uri就变成了com.fuyunwang.provider/query */ sURIMatcher.addURI("com.fuyunwang.provider", "query", QUERYSUCCESS); sURIMatcher.addURI("com.fuyunwang.provider", "insert", INSERTSUCCESS); sURIMatcher.addURI("com.fuyunwang.provider", "update", UPDATESUCCESS); sURIMatcher.addURI("com.fuyunwang.provider", "delete", DELSUCCESS); } private MyOpenHelper myOpenHelper; //当内容提供者初始化的时候走这个方法 @Override public boolean onCreate() { //初始化MyOpenHelper对象 myOpenHelper = new MyOpenHelper(getContext()); return false; } @Nullable @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { int code = sURIMatcher.match(uri); if (QUERYSUCCESS == code) { //此时说明路径匹配成功 SQLiteDatabase sqLiteDatabase = myOpenHelper.getReadableDatabase(); Cursor cursor = sqLiteDatabase.query("info", projection, selection, selectionArgs, null, null, sortOrder); return cursor; } else { throw new IllegalArgumentException("URI路径不匹配,请确认URL"); } } @Nullable @Override public String getType(Uri uri) { return null; } @Nullable @Override public Uri insert(Uri uri, ContentValues values) { int code = sURIMatcher.match(uri); if (code == INSERTSUCCESS) { SQLiteDatabase db = myOpenHelper.getReadableDatabase(); long insert = db.insert("info", null, values); Uri uri2 = Uri.parse("fuyunwang...insert" + insert); return uri2; } else { throw new IllegalArgumentException("URI路径不匹配,请确认URL"); } } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int code = sURIMatcher.match(uri); if (code == DELSUCCESS) { SQLiteDatabase db = myOpenHelper.getReadableDatabase(); //返回值代表影响的行数 int del = db.delete("info", selection, selectionArgs); return del; } return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int code = sURIMatcher.match(uri); if (code == UPDATESUCCESS) { SQLiteDatabase db = myOpenHelper.getReadableDatabase(); //代表影响的行数 int upda = db.update("info", values, selection, selectionArgs); return upda; } return 0; } }
4.在另一个项目中通过内容解析者来访问别的项目的数据:
public void click1(View v) { Uri uri1 = Uri.parse("content://com.fuyunwang.provider/insert"); ContentValues values = new ContentValues();//实际是map //key是列名 value对应值 values.put("name", "zhaoliu"); values.put("money", "6000"); //插入一条数据 Uri urill = getContentResolver().insert(uri1, values); Toast.makeText(this, "urill:" + urill, Toast.LENGTH_LONG).show(); } public void click2(View v) { Uri uri3 = Uri.parse("content://com.fuyunwang.provider/delete"); int dele = getContentResolver().delete(uri3, "name=?", new String[]{"zhaoliu"}); Toast.makeText(this, "删除了" + dele + "行", Toast.LENGTH_LONG).show(); } public void click3(View v) { Uri uri5 = Uri.parse("content://com.fuyunwang.provider/update"); ContentValues values = new ContentValues(); values.put("money", "10000"); int update = getContentResolver().update(uri5, values, "name=?", new String[]{"zhaoliu"}); Toast.makeText(this, "更新了" + update + "行", Toast.LENGTH_LONG).show(); } //查询的操作 public void click4(View v) { /***拿到内容解析者,获取数据 * 第一个参数是路径的Uri */ Uri uri = Uri.parse("content://com.fuyunwang.provider/query"); Cursor cursor = getContentResolver().query(uri, new String[]{"name", "money"}, null, null, null); if (cursor != null && cursor.getCount() > 0) { while (cursor.moveToNext()) { String name = cursor.getString(0); String money = cursor.getString(1); Toast.makeText(this, "name:" + name + "money" + money, Toast.LENGTH_LONG).show(); } } }
相关文章推荐
- android studio关联源码
- Android几种数据存储的方式
- Android project的结构
- android 蓝牙搜索功能实现
- 关于回调函数
- 用户登录界面
- Android 5.0以后启动服务的正确做法
- Android之监听手机软键盘弹起与关闭
- Android项目前的准备
- Android中自定义View的MeasureSpec使用
- Android Studio 集成阿里百川SDK
- Android-PullToRefresh的用法 及源码中你应该知道的一些东西
- Android SlidingMenu 开源项目 侧拉菜单的使用(详细配置)
- Android中TabLayout切换选项背景和修改字体大小
- Android SlidingMenu 开源项目实现侧拉菜单(二)
- Android 5.0源码编译问题
- Android开机动画
- Android SlidingMenu 开源项目实现侧拉菜单(一)
- 练习Android大图轮播效果的实现-大致布局
- Android Service的生命周期