Android数据库和内容提供者ContentProvider
2016-03-15 20:57
393 查看
引言
昨天写了一篇关于自定义控件的博客,结果访问量竟然直逼三百,而我之前费劲心力写的ndk的两篇博客竟然加起来不到60。没办法了,我也只能投其所好再给大家写点儿安卓原声的东西吧。已经想好了就写android的数据库。android数据库应用
安卓数据库一般有两种应用方式
1-继承SqliteOperHelper.自己定义数据库2-运用ContentResolver调用系统的数据库(如果其它应用开放接口的话也可以调用哟)
第一种方法说的不多,比较好理解,百度的资料也很多,我会在后面贴出代码,下面是第一种方法的程序运行结果。
下面讲解第二种数据库应用,
一般来说这种方法百分之九十九的情况都是去调用系统的数据库,除非你的应用做到了qq微信的级别才会考虑自己写接口供别人调用吧。
这里以系统的媒体数据库 的图片数据库为例进行讲解,为了方便讲解我导出了系统的数据库,可以看到系统 的数据库结构如下图
从这张图可以看出系统的媒体数据库分为外部媒体数据库,和内部媒体数据库,一般来说有几张内存卡就会有几个外部媒体数据库,我们主要讲解外部的媒体数据库。
从上图可以看出媒体数据库里面的表和视图加起来有十几张,看起来是不是眼花缭乱,无从下手,没关系我的目的就是治愈各位的眼花手残问题。经过我的研究发现,虽然表很多但是真正和图片数据库有关系的只有 images 和 files两张表(images是视图)而我们的这个例子就更好办了,因为我只用到了images这张视图。
.
打开images这张视图可以看到里面有很多字段,_id(图片的id),size(图片的尺寸),以及display_name, mimetype ,title,
尤其注意到了data这个字段没有,看着它的字符串的格式有没有明白什么,没错它就是我们图片在存储器中的路径,那么有了路径就不用我多说了吧,
相信各位都可以就此成功拿到图片。
这张图片是files的字段, 很多情况下我们需要将files和images两个表(以后姑且把视图也叫表了)一起联合使用,大家可以自己挖掘(友情提示mimetype是这两张表的重要联系纽带哟,有兴趣可以自己看看吗)。
下面我通过一张图来说好说数据库表与ContentProvider的关系!!!!理解这个非常重要,能够理解透这个你就可以像我一样不用百度查遍所以系统数据库表。
先看看下面这张图吧
丑爆了有没有,我自己都快被丑哭了,不过不影响我们分析解决问题
系统媒体数据库对应了图中的ContentProvider,而数据库里的表则对应了这个类里面的名字相同的内部类,由此可以推想是不是表里的字段就对应类里 的全局变量呢,不过还是不要想了,因为这个已经被我证实过了,各位只管放心去看便是。原理就是这样,只要各位同学真正明白个中道理就能像我一样活用数据库。
以上就是今天的全部内容,下面是代码时间
代码部分
普通数据库应用
package com.example.test; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class Database extends SQLiteOpenHelper{ private static final String DB_NAME = "class"; private static final int DB_VERSION = 1; private static final String sql = "create table class (_id integer primary key autoincrement,name text not null,age integer not null)"; public Database(Context context, String name, CursorFactory factory, int version) { super(context, DB_NAME, null, DB_VERSION); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } }
ContentProvider应用
package com.example.test; /** * 查询系统数据库的类 */ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import android.app.Activity; import android.content.ContentResolver; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.provider.MediaStore.Images; import android.provider.MediaStore.Images.Media; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; public class SystemDbActivity extends Activity implements OnClickListener { private ContentResolver resolver; private Button search; private Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; private ImageView image; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_system); initData(); initView(); initListener(); } private void initListener() { // TODO Auto-generated method stub search.setOnClickListener(this); } private void initData() { // TODO Auto-generated method stub // resolver = MediaStore.Images.Media.getContentUri() } private void initView() { // TODO Auto-generated method stub search = (Button) findViewById(R.id.btn_system); image = (ImageView) findViewById(R.id.img_system); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.btn_system: // resolver.query(uri ,null , selection, selectionArgs, null); try { Uri uri2 = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; Uri uri3 = MediaStore.getMediaScannerUri(); Cursor cursor = getContentResolver().query(uri2, new String[] { Images.Thumbnails.DATA }, null, null, null); while (cursor.moveToNext()) { String data = cursor.getString(0); File file = new File(data); FileInputStream fis = new FileInputStream(file); Bitmap bitmap = BitmapFactory.decodeStream(fis); System.out.println(bitmap); image.setImageBitmap(bitmap); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } break; default: break; } } }
package com.example.test; import android.app.Activity; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class CustomDatabaseActivity extends Activity implements OnClickListener { private EditText et_id,et_age,et_name,et_query_id; private Button btn_query,btn_insert; private TextView showInfo; private SQLiteOpenHelper helper; private SQLiteDatabase database; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_custom_db); initData(); initView(); initListener(); } private void initData() { // TODO Auto-generated method stub helper = new Database(this, "class", null, 1); database = helper.getWritableDatabase(); } private void initListener() { // TODO Auto-generated method stub btn_insert.setOnClickListener(this); btn_query.setOnClickListener(this); } private void initView() { // TODO Auto-generated method stub et_name = (EditText) findViewById(R.id.et_name); et_age = (EditText) findViewById(R.id.et_age); et_id = (EditText) findViewById(R.id.et_id); et_query_id = (EditText) findViewById(R.id.et_query_id); btn_insert = (Button) findViewById(R.id.btn_insert_custom); btn_query = (Button) findViewById(R.id.btn_query_custom); showInfo = (TextView) findViewById(R.id.tv_showinfo); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.btn_insert_custom: ContentValues values = new ContentValues(); values.put("_id", Integer.parseInt(et_id.getText().toString())); values.put("name", et_name.getText().toString()); values.put("age", Integer.parseInt(et_age.getText().toString())); database.insert("class", null, values ); values.clear(); break; case R.id.btn_query_custom: int q_id = Integer.parseInt(et_query_id.getText().toString()); Cursor cursor = database.query("class", new String[]{"_id","name","age"}, "_id="+q_id,null, null, null, null); int _id = 0; int age = 0; String name = null; while (cursor.moveToNext()) { _id = cursor.getInt(0); name = cursor.getString(1); age = cursor.getInt(2); } showInfo.setText("name : "+name +"--"+"age="+age+"--"+"_id="+_id); break; default: break; } } }
联系我
QQ:1275054668Email:pook216@163.com
相关文章推荐
- SQL性能优化
- sql server 统计各省份人数前几名和其他
- oracle 学习笔记 varchar2
- MySQL中concat函数(连接字符串)
- 数据库锁(转)
- 数据库备份
- 机房收费系统遇到的问题(一) datagridview一次性移除多行选中数据,同时删除数据库数据
- MySQL MYISAM引擎表锁和行锁详解
- oracle应用dblink交换数据
- mysqlbinlog 读取多个文件
- mysqlbinlog 读取多个文件
- Oracle Day01 数据库基础
- 【转】mysql安装完成之后为root用户添加密码
- Linux下创建Oracle的OEM
- mysql大数据导出导入
- iOS平台的数据库框架 FMDB
- 关于数据库导出和导入sql备份文件
- ORACLE 12C 导入9i导出的含有多个用户的dmp文件
- InnoDB数据库死锁
- ADO几种数据库连接方式