您的位置:首页 > 移动开发 > Android开发

Android文件存储(二)与ContentProvider

2016-06-26 20:28 316 查看
本篇介绍Android中的数据库SQLite,同时介绍Android中的四大组件中的ContentProvider

一:数据库的创建:

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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: