Android数据库和内容提供者ContentProvider
引言
昨天写了一篇关于自定义控件的博客,结果访问量竟然直逼三百,而我之前费劲心力写的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:1275054668
Email:pook216@163.com
更多相关文章
- Android(安卓)3D旋转动画——Rotate3dAnimation
- Android入门教程(三十二)------之SQLite分页表格
- ListView怎么处理大量的加载数据;比如有10万条数据,你在ListView怎
- Android(安卓)应用程序之间数据共享—ContentResolver
- android中Media Playback(媒体播放)
- Android中实现SQLite数据库CRUD操作的两种方式
- android视图学习---Android深入浅出之Surface[1]
- Android(安卓)控件架构
- 说说 Android(安卓)中的 SQLite 数据库