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/<package name>/files目录
-实现过程与在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/<package name>/files),其他程序无法访问。除非在创建时指定了MODE_WORLD_READABLE或者
MODE_WORLD_WRITEABLE。
ContentProvider
.如何实现ContentProvider?
1.继承抽象类ContentProvider实现一系列针对于数据的增删改查等方法;
2.需在AndroidMainfest.xml中完成对ContentProvider的注册。
<provider
android:name="com.example.MusicProvider"
android:authorities="com.provider.music" >
</provider>
注:注册的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; } }
<uses-permission android:name="android.permission.READ_CONTACTS"/>
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(); }
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
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);