SQLiteOpenHelper:
- SQLiteDatabase的帮助类,用于管理数据库的创建和版本更新
- 一般是建立一个类继承它,并重写onCretae()和onUpgrade()方法
- 方法说明
onCreate(SQLiteDatabase db) 创建数据库时调用
onUpgrade(SQLiteDatabase db, int oldVersion, int new Version) 版本更新时调用
getReadableDatabase() 创建或打开一个只读数据库
getWritableDatabase() 创建或打开一个读写数据库
public class DBOpenHelper extends SQLiteOpenHelper {
public DBOpenHelper(Context context, String name) {
super(context, name, null, 1);
}
// 首次创建数据库的时候调用 一般可以把建库 建表的操作
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exists stutb(_id integer primary key autoincrement, name text not null, sex text not null, age integer not null)");
db.execSQL("insert into stutb(name, sex, age)values('zhangsan', 'female', 18)");
}
// 当数据库的版本发生变化的时候 会自动执行
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
DBOpenHelper helper = new DBOpenHelper(MainActivity.this, "stu.db");
// helper.getReadableDatabase(); // 获取一个只读的数据库 只能查询 不能写入 不能更新
SQLiteDatabase db = helper.getWritableDatabase();
Cursor c = db.rawQuery("select * from stutb", null);
if (c != null) {
String[] cols = c.getColumnNames();
while (c.moveToNext()) {
for(String ColumnName : cols) {
Log.i("info", ColumnName + " : " + c.getString(c.getColumnIndex(ColumnName)));
}
}
c.close();
}
db.close();
Android中文件存储的操作:
-Activity的openFileOutput()方法可以用于把数据输出到文件中
-创建的文件保存在/data/data/
-实现过程与在Java中保存数据到文件中是一样的
File file = new File("/mnt/sdcard/test");
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
Toast.makeText(MainActivity.this, "exists", 1000);
}
file.delete();
MODE_PRIVATE
-为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
MODE_APPEND
-模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件
MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE
-用来控制其他应用是否有权限读写该文件
// 这个目录是当前应用程序默认的数据存储目录
// File file = this.getFilesDir(); // /data/data/com.example.filedemo/files
// File file = this.getCacheDir(); // 这个目录是当前应用程序默认的缓存文件的存放位置
// // 把一些不是非常重要的文件在此处创建 使用
// // 如果手机的内存不足的时候 系统会自动去删除App的cache目录的数据
// Log.i("info", file.toString());
// /data/data/<包名>/app_a
// File file = this.getDir("a", MODE_PRIVATE);
// Log.i("info", file.toString());
// this.getExternalFilesDir(type);
// 可以得到外部的存储位置 该位置的数据跟内置的使用是一样的
// 如果App卸载了 这里面的数据也会自动清除掉
File file = this.getExternalCacheDir();
Log.i("info", file.toString());
// 如果开发者不遵守这样的规则 不把数据放入data/data/<包名>
// /mnt/sdcard/Android/data/<包名>
// 卸载之后数据将不会自动清除掉 将会造成所谓的数据垃圾
// 保存文件内容
public void WriteFiles(String content) {
// MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE
try {
FileOutputStream fos = openFileOutput("a.txt", MODE_PRIVATE);
fos.write(content.getBytes());
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 读取文件内容
public String readFiles() {
String content = null;
try {
FileInputStream fis = openFileInput("a.txt");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
content = baos.toString();
fis.close();
baos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return content;
}
当应用程序在安装时系统就会分配给它一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,
sharedpreferences,数据库都应该是私有的(位于/data/data/
MODE_WORLD_WRITEABLE。
ContentProvider
.如何实现ContentProvider?
1.继承抽象类ContentProvider实现一系列针对于数据的增删改查等方法;
2.需在AndroidMainfest.xml中完成对ContentProvider的注册。
android:name="com.example.MusicProvider" android:authorities="com.provider.music" >
注:注册的authorities属性值是全局唯一的
UriMatcher类
- UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
. UriMatcher.NO_MATCH 表示不匹配任何路径的返回码
- matcher.addURI("com.example.provider", "music", 1);
. 往UriMatcher类里添加一个拼凑的Uri
. UriMatcher为一个Uri容器,容器里面包含着我们即将可能要操作的Uri
. 如果通过match()方法匹配成功就返回code值
- matcher.match(uri)
. 首先与通过addURI()方法添加进来的Uri匹配
. 匹配成功则返回设置的code1值,反之,返回一个UriMatcher.NO_MATCH常量(-1)
ContentResolver:
- 使用ContentResolver操作ContentProvider中的数据:
. 当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成
. 使用Activity提供的getContentResolver()方法获取ContentResolver对象
public class MyContentProvider extends ContentProvider {
// 根据Uri删除selection指定的条件所匹配的全部记录
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
// 返回当前uri的MIME类型,如果该URI对应的数据可能包括多条记录
// 那么MIME类型字符串 就是以vnd.android.dir/开头
// 如果该URI对应的数据只有一条记录 该MIME类型字符串 就是以vnd.android.cursor.item/开头
@Override
public String getType(Uri uri) {
return null;
}
// 根据Uri插入Values对应的数据
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}
// 在COntentProvider创建后被调用
@Override
public boolean onCreate() {
return false;
}
// 根据uri查询出selection指定的条件所匹配的全部记录,并且可以指定查询哪些列 以什么方式(order)排序
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
return null;
}
// 根据uri修改selection指定的条件所匹配的全部记录
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
return 0;
}
}
ContentResolver cr = getContentResolver();
// ContactsContract.Contacts
Cursor c = cr.query(Contacts.CONTENT_URI, new String[]{Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null);
if (c != null) {
while (c.moveToNext()) {
int id = c.getInt(c.getColumnIndex("_id"));
Log.i("info", "_id : " + id);
// 或使用上面的常量Contacts._ID、Contacts.DISPLAY_NAME等
Log.i("info", "name : " + c.getString(c.getColumnIndex("display_name")));
Cursor c1 = cr.query(Phone.CONTENT_URI, new String[]{Phone.NUMBER, Phone.TYPE}, Phone.CONTACT_ID + "=" + id, null, null);
// 根据联系人ID查询出联系人的电话号码
if (c1 != null) {
while (c1.moveToNext()) {
int type = c1.getInt(c1.getColumnIndex(Phone.TYPE));
if (type == Phone.TYPE_HOME) {
Log.i("info", "home phone number : " + c1.getString(c1.getColumnIndex(Phone.NUMBER)));
} else if (type == Phone.TYPE_MOBILE) {
Log.i("info", "mobile phone : number " + c1.getString(c1.getColumnIndex(Phone.NUMBER)));
}
}
c1.close();
}
// 根据联系人的ID去查询出联系人的邮箱地址
Cursor c2 = cr.query(Email.CONTENT_URI, new String[]{Email.DATA, Email.TYPE}, Email.CONTACT_ID + "=" + id, null, null);
if (c2 != null) {
while (c2.moveToNext()) {
int type = c2.getInt(c2.getColumnIndex(Email.DATA));
if (type == Email.TYPE_WORK) {
Log.i("info", "work email : " + c1.getString(c2.getColumnIndex(Email.DATA)));
}
}
c2.close();
}
}
c.close();
}
ContentResolver cr = getContentResolver();
// 向联系人中 插入一行数据
ContentValues values = new ContentValues();
Uri uri = cr.insert(RawContacts.CONTENT_URI, values);
Long raw_contact_id = ContentUris.parseId(uri);
values.clear();
// 插入人名
values.put(StructuredName.RAW_CONTACT_ID, raw_contact_id);
values.put(StructuredName.DISPLAY_NAME, "zhangsansan");
values.put(StructuredName.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
uri = cr.insert(Data.CONTENT_URI, values);
// 插入电话信息
values.clear();
values.put(Phone.RAW_CONTACT_ID, raw_contact_id);
values.put(Phone.NUMBER, "13333333333333");
values.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
uri = cr.insert(Data.CONTENT_URI, values);