您的位置:首页 > 数据库

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:1275054668

Email:pook216@163.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: