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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值