android BaseColumns的用处

2024-06-09 02:32
文章标签 android 用处 basecolumns

本文主要是介绍android BaseColumns的用处,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、ContentProvider的基本概念

     1> ContentProvider为存储和读取数据提供了统一的接口

     2> 使用ContentProvider,应用程序可以实现数据共享

     3> android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)

2、Uri

     1> 每一个ContentProvider都拥有一个公共的Uri,这个Uri用于表示这个ContentProvider提供的数据

     2> Android所提供的ContentProvider都存放在andriod.provider这个包里面

3、ContentProvider提供的函数

     1> query() 查询

     2> insert() 插入

     3> update() 更新

     4> delete() 删除

   5> getType() 得到数据类型

     6> onCreate() 创建时的回调函数

4、实现ContentProvider的过程

    1> 定义一个COTENT_URI常量

    2> 定义一个类,继承ContentProvider

    3> 实现query(),delete(),update(),insert(),onCreate(),getType()方法

    4> 在AndroidMainfest.xml中申明

 

 

下面以两个实例(一个是ContentProvider所在的应用,另一个是使用ContentProvider的应用),说明如何使用ContentProvider

 

5、ContentProvider所在的应用

 

1>定义一个类,里面定义一些常量


package com.yyl.android;

import android.net.Uri;
import android.provider.BaseColumns;

public class MyUsers {
    
    public static final String AUTHORITY = "com.yyl.android.MyContentProvider";
    
    //BaseColumn类中已经包含了_id字段
    public static final class User implements BaseColumns
    {
        //定义Uri
        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
        //定义数据表列
        public static final String USER_NAME = "USER_NAME";
    }

}

 

2>定义一个继承ContentProvider的子类,实现其方法

package com.yyl.android;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;


/*
 * MyContentProvider继承ContentProvider类,实现其insert,update,delete,getType,onCreate等方法
 */
public class MyContentProvider extends ContentProvider {

    //定义一个SQLiteDatabase变量
    private SQLiteDatabase sqlDB;
    //定义一个DatabaseHelper变量
    private DatabaseHelper dbHelper;
    //数据库名
    private static final String DATABASE_NAME = "Users.db";
    //数据库版本
    private static final int DATABASE_VERSION = 1;
    //表名
    private static final String TABLE_NAME = "User";
    //标签
    private static final String TAG = "MyContentProvider";

    /*
     * 定义一个内部类
     * 
     * 这个内部类继承SQLiteOpenHelper类,重写其方法
     */
    public static class DatabaseHelper extends SQLiteOpenHelper {

        //构造方法
        public DatabaseHelper(Context context) {
            //父类构造方法
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        //当第一次创建数据库的时候调用该方法,可以为数据库增加一些表,和初始化一些数据
        @Override
        public void onCreate(SQLiteDatabase db) {
            //在数据库里生成一张表
            db.execSQL("Create table "
                    + TABLE_NAME
                    + "( _id INTEGER PRIMARY KEY AUTOINCREMENT, USER_NAME TEXT);");
        }

        //当更新数据库版本的时候,调用该方法。可以删除,修改表的一些信息
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
            onCreate(db);

        }

    }

    //这是一个回调函数,当生成所在类的对象时,这个方法被调用,创建一个数据库
    @Override
    public boolean onCreate() {
        dbHelper = new DatabaseHelper(getContext());
        return (dbHelper == null) ? false : true;
    }

    //查询
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        qb.setTables(TABLE_NAME);
        Cursor c = qb.query(db, projection, selection, null, null, null,
                sortOrder);
        c.setNotificationUri(getContext().getContentResolver(), uri);
        return c;
    }

    //取得类型
    @Override
    public String getType(Uri uri) {
        return null;
    }

    //插入数据
    @Override
    public Uri insert(Uri uri, ContentValues contentvalues) {
        sqlDB = dbHelper.getWritableDatabase();
        long rowId = sqlDB.insert(TABLE_NAME, "", contentvalues);
        if (rowId > 0) {
            Uri rowUri = ContentUris.appendId(
                    MyUsers.User.CONTENT_URI.buildUpon(), rowId).build();
            getContext().getContentResolver().notifyChange(rowUri, null);
            return rowUri;
        }
        throw new SQLException("Failed to insert row into" + uri);
    }

    //删除数据
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    //更新数据
    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        return 0;
    }

}

3>定义一个默认加载的Activity,里面对ContentProvider进行数据加载

package com.yyl;

import com.yyl.android.MyUsers;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.Toast;

public class MyContentDemo extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        insertRecord("MyUser");
        insertRecord("YangYuLin");
        displayRecords();
    }

    private void insertRecord(String userName) {
        ContentValues values = new ContentValues();
        values.put(MyUsers.User.USER_NAME, userName);
        getContentResolver().insert(MyUsers.User.CONTENT_URI, values);
    }

    private void displayRecords() {
        String columns[] = new String[] { MyUsers.User._ID,
                MyUsers.User.USER_NAME };
        Uri myUri = MyUsers.User.CONTENT_URI;
        Cursor cur = managedQuery(myUri, columns, null, null, null);
        if (cur.moveToFirst()) {
            String id = null;
            String userName = null;
            do {
                id = cur.getString(cur.getColumnIndex(MyUsers.User._ID));
                userName = cur.getString(cur
                        .getColumnIndex(MyUsers.User.USER_NAME));
                Toast.makeText(this, id + " " + userName, Toast.LENGTH_LONG)
                        .show();
            } while (cur.moveToNext());
        }
    }
}


4>在AndroidMainfest.xml里注册

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.yyl"
      android:versionCode="1"
      android:versionName="1.0">
     
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <provider android:name=".android.MyContentProvider" android:authorities="com.yyl.android.MyContentProvider" /> 
        <activity android:name=".MyContentDemo"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    <uses-sdk android:minSdkVersion="7" />
    
</manifest>

 


6、做另一个App.使用上面ContentProvider提供的数据

 

package yyl.client;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class CPClientActitity extends Activity {
   
    public static final String AUTHORITY = "com.yyl.android.MyContentProvider";    
    private Button insertButton = null;
    //访问ContentProvider的Uri
    Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //得到ContentProvider对于表的所有数据,以游标格式保存
        Cursor c = managedQuery(CONTENT_URI,new String[]{"_id","USER_NAME"},null,null,null);
        
        //循环打印ContentProvider的数据
        if(c.moveToFirst())
        {
            String _id = null;
            String user_name = null;
            
            do
            {
                //得到_id列,USER_NAME列
                _id = c.getString(c.getColumnIndex("_id"));
                user_name = c.getString(c.getColumnIndex("USER_NAME"));
                
                System.out.println("_id = " + _id +", user_name = " + user_name);
                
            }while(c.moveToNext());
        }
        
        //根据Id得到控件对象
        insertButton = (Button)findViewById(R.id.Insert);
        //给按钮绑定事件监听器
        insertButton.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                
                //得到EditText输入的数据
                String username = ((EditText)findViewById(R.id.userName)).getText().toString();
                //生成一个ContentResolver对象
                ContentResolver cr = getContentResolver();
                //生成一个ContentValues对象
                ContentValues values = new ContentValues();
                //将EditText输入的值,保存到ContentValues对象中
                values.put("USER_NAME", username);                
                //插入数据
                cr.insert(CONTENT_URI, values);
            }
        });
    }
}

这篇关于android BaseColumns的用处的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1044008

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

Android逆向(反调,脱壳,过ssl证书脚本)

文章目录 总结 基础Android基础工具 定位关键代码页面activity定位数据包参数定位堆栈追踪 编写反调脱壳好用的脚本过ssl证书校验抓包反调的脚本打印堆栈bilibili反调的脚本 总结 暑假做了两个月的Android逆向,记录一下自己学到的东西。对于app渗透有了一些思路。 这两个月主要做的是代码分析,对于分析完后的持久化等没有学习。主要是如何反编译源码,如何找到

android系统源码12 修改默认桌面壁纸--SRO方式

1、aosp12修改默认桌面壁纸 代码路径 :frameworks\base\core\res\res\drawable-nodpi 替换成自己的图片即可,不过需要覆盖所有目录下的图片。 由于是静态修改,则需要make一下,重新编译。 2、方法二Overlay方式 由于上述方法有很大缺点,修改多了之后容易遗忘自己修改哪些文件,为此我们采用另外一种方法,使用Overlay方式。