ContentProvider及AsnycQueryHandler的使用

DEAP数据集实战指南:从脑电信号到情绪分类的完整流程解析 本文提供了DEAP数据集在脑电信号情绪识别领域的完整实战指南。详细解析了数据下载、结构理解、频带功率特征提取等核心步骤,并演示了如何构建和评估机器学习分类模型,为研究者实现从原始脑电信号到情绪分类的完整流程提供了清晰路径。 阅读详情

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.dxt;

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

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

}

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


package com.dxt;

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;
import android.util.Log;


/*
 * 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) {
            //在数据库里生成一张表
        	String sql = "CREATE TABLE IF NOT EXISTS "
    				+ TABLE_NAME
    				+ " (_id integer primary key autoincrement, "+MyUsers.User.USER_NAME+" text, "+MyUsers.User.USER_TEL+" text);";
    		db.execSQL(sql);
    		Log.d(TAG, "DatabaseHelper--->oncreate");
//            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) {
  SQLiteDatabase db = dbHelper.getReadableDatabase();  
//      qb.setTables(TABLE_NAME);  
      Cursor c = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);  
//      query(USER_TABLE, null,null, null, null, null, " _id desc");//asc  desc  
      c.setNotificationUri(getContext().getContentResolver(), uri);  
      Log.d(TAG, "query----->"+c.getCount());  
      db.close();
        return c;
    }

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

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

    //删除数据
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
    	SQLiteDatabase db = dbHelper.getReadableDatabase(); 
         int rowId = db.delete(TABLE_NAME, selection, selectionArgs);  
         Log.i(TAG, "delete item && row id = " + rowId);  
         db.close();
        return rowId;
    }

    //更新数据
    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
   SQLiteDatabase db = dbHelper.getWritableDatabase();
        int rows = db.update(TABLE_NAME, values, selection, selectionArgs);
        db.close();
		Log.i(TAG, "update item && rows = " + rows);

        return rows;
    }

}


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

package com.dxt;import android.app.Activity;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.util.Log;import android.widget.Toast;public class MyContentDemo extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        for (int i = 0; i < 500; i++) {            insertRecord("name"+ i,"100000000"+i);        }//        insertRecord("MyUser","100000000");//        insertRecord("YangYuLin","222222222");        displayRecords();    }    private void insertRecord(String userName,String telephone) {        ContentValues values = new ContentValues();        values.put(MyUsers.User.USER_NAME, userName);        values.put(MyUsers.User.USER_TEL, telephone);        getContentResolver().insert(MyUsers.User.CONTENT_URI, values);    }    private void displayRecords() {        String columns[] = new String[] { MyUsers.User._ID,                MyUsers.User.USER_NAME ,MyUsers.User.USER_TEL};        Uri myUri = MyUsers.User.CONTENT_URI;        Cursor cur = managedQuery(myUri, columns, null, null, null);        if (cur.moveToFirst()) {            String id = null;            String userName = null;            String tel = null;            do {                id = cur.getString(cur.getColumnIndex(MyUsers.User._ID));                userName = cur.getString(cur                        .getColumnIndex(MyUsers.User.USER_NAME));                tel = cur.getString(cur.getColumnIndex(MyUsers.User.USER_TEL));//                Toast.makeText(this, id + " " + userName + " " + tel, Toast.LENGTH_LONG)//                        .show();                Log.d("tag", "name = " + userName + "\ntel = " + tel);            } 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.dxt"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <provider android:name=".MyContentProvider" android:authorities="com.dxt.MyContentProvider" />
        <activity android:name="com.dxt.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>

</manifest> 

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

package com.CPClientActitity.dxt;

import android.app.Activity;
import android.os.Bundle;

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.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class CPClientActitity extends Activity {
   
    public static final String AUTHORITY = "com.dxt.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","_Name","_Tel"},null,null,null);
        Cursor c = getContentResolver().query(CONTENT_URI, null, null,null, "_id desc");
        //循环打印ContentProvider的数据
        if(c.moveToFirst())
        {
            String _id = null;
            String user_name = null;
            String tel_num = null;
            do
            {
                //得到_id列,USER_NAME列
                _id = c.getString(c.getColumnIndex("_id"));
                user_name = c.getString(c.getColumnIndex("_Name"));
                tel_num = c.getString(c.getColumnIndex("_Tel"));
                Log.d("tag", "_id = " + _id +", _Name = " + user_name + "_Tel = " + tel_num);
                
            }while(c.moveToNext());
        }

  Toast.makeText(getApplicationContext(), "数据添加完成!!!", Toast.LENGTH_SHORT).show();
        if(c != null){
            Toast.makeText(getApplicationContext(), "cursor已经关闭了啊 !!!", Toast.LENGTH_SHORT).show();
            c.close();
        }
        
        //根据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();
                String tel_num = ((EditText)findViewById(R.id.tel_num)).getText().toString();
                //生成一个ContentResolver对象
                ContentResolver cr = getContentResolver();
                //生成一个ContentValues对象
                ContentValues values = new ContentValues();
                //将EditText输入的值,保存到ContentValues对象中
                values.put("_Name", username);
                values.put("_Tel", tel_num);
                //插入数据
                cr.insert(CONTENT_URI, values);
               
            }
        });
    }
}


文章出处:http://www.cnblogs.com/-cyb/articles/2098338.html

AsyncQuerHandler 下一篇进行讲解




        
使用R语言实战:构建Logistic回归模型 Logistic回归是一种基于概率的分类算法,它用于预测离散的结果变量(也称为响应变量或因变量)。与线性回归不同,Logistic回归的输出是一个概率值,通常在0和1之间。这使得它非常适合处理二分类问题。市场营销:预测客户是否会购买某个产品。医学研究:预测疾病的发生与否。信用风险评估:预测个人申请贷款的违约风险。社会科学:预测个人对某个政策的态度。 阅读详情

相关推荐

Vivado ILA抓不到低频信号?试试Capture Control模式,保姆级配置教程(附PWM调试实例)

本文详细解析了Vivado ILA的Capture Control模式在低频信号捕获中的应用,特别针对PWM调试等场景提供保姆级配置教程。通过条件采样和时间拉伸技术,有效解决传统ILA采样在低频信号调试中的存储深度不足、关键信号丢失等问题,并附赠呼吸灯PWM的完整调试实例,帮助FPGA开发者提升调试效率。

weixin_42549451的博客 350

AsyncQueryHandler、CursorAdapter和ContentProvider的使用

一、AsyncQueryHandler的使用 该类是谷歌封装的异步查询的Handler,这个类是抽象类但是其并没有抽象方法。具体使用方法如下所示: package com.study.yang.contentproviderclientdemo.handler import android.content.AsyncQueryHandler import android.content.Cont...

Duckdan的博客 311

全网最详细 解决戴维南定理的详细推导

替代定理,戴维南定理详细证明

m0_52555753的博客 3万+

AsyncQueryHandler的使用

AsyncQueryHandler简介:异步的查询操作帮助类,可以处理增删改(ContentProvider提供的数据)使用AsyncQueryHandler的场景:查询数据库,如果数据太多会造成主线程堵塞导致ANR,所以需要开启子线程,然后 用Handler将结果回传。而使用android系统提供的AsyncQueryHandler方便的实现这个过程。在一般的应用中可以使用ContentProvi

秦时明月 4991

使用pyqt5实现可勾选的测试用例界面

使用pyqt5实现可勾选的测试用例界面

天赐好车的博客 629

基于双向GRU LSTM DNN水电站水文数据的每日径流量预测 完整代码+数据 可直接运行

基于双向GRU LSTM DNN水电站水文数据的每日径流量预测 完整代码+数据 可直接运行

1902

AsyncQueryHandler详解及使用

AsyncQueryHandler详解及使用 AsyncQueryHandler详解及使用 AsyncQueryHandler概述 AsyncQueryHandler实现原理 AsyncQueryHandler的使用 AsyncQueryHandler概述 项目中,用到了AsyncQueryHandler,所以在这里将自己对它的理解写出来,做一个总结。如果有错误的地方,或...

大狮子的博客 4848

打开 AI 投研新时代 —— 深度解析 GitHub 高星项目 daily_stock_analysis

GitHub热门开源项目"daily_stock_analysis"是一款AI驱动的智能股票分析工具,能自动抓取行情数据、分析新闻语义并生成结构化报告。该项目采用Python开发,通过GitHub Actions实现全自动运行,支持邮件、企业微信等多渠道推送。核心功能包括AI决策仪表盘、多数据源整合和零成本部署方案,特别适合需要自动化投研辅助的个人投资者。项目强调其仅为分析工具而非投资建议,提醒用户注意AI模型的潜在误差。该工具通过智能化处理重复工作,帮助投资者提升决策效率,成为量化投资

陈奕昆的博客 1526

Android的Animation之LayoutAnimation使用方法

LayoutAnimationController用于为一个layout里面的控件,或者是一个ViewGroup里面的控件设置动画效果,可以在XML文件中设置,亦可以在Java代码中设置。 一种直接在XML文件中设置 1.  在res/anim文件夹下新建一个XML文件,名为list_anim_layout.xml, <layoutAnimation xmlns:android="htt

少爷 5万+

机器学习扩散模型简介

​ 扩散模型是生成模型,在过去几年中越来越受欢迎,这是有充分理由的。仅在 2020 年代发布的几篇开创性论文就向世界展示了 Diffusion 模型的能力,例如在图像合成方面击败 GAN[6]。最近,从业者将看到DALL-E 2(OpenAI 上个月发布的图像生成模型)中使用的扩散模型。

gongdiwudu的专栏 4268

TPAMI 2024 | 基于外观的深度学习凝视估计:综述与基准测试

人类目光提供了关于人类焦点和意图的有价值信息,使其成为研究的关键领域。最近,深度学习彻底改变了基于外观的眼神估计。然而,由于眼神估计研究的独特特征,如2D眼神位置和3D眼神向量之间的不公平比较以及不同的预处理和后处理方法,缺乏开发基于深度学习的眼神估计算法的明确指导方针。在本文中,我们系统回顾了使用深度学习的眼神估计方法。首先,我们沿着典型的眼神估计流程调查现有的算法:深度特征提取、深度学习模型设计、个人校准和平台。

小白学视觉 342

android 用代码编写linearlayout布局

m_LinearLayout = new LinearLayout(this);//创建LinearLayout布局对象 m_LinearLayout.setOrientation(LinearLayout.VERTICAL);//设置布局LinearLayout的属性 m_LinearLayout.setBackgroundColor(android.graphi

少爷 3万+

2. 第一个 SAP CDS View 源代码的详细解析:CDS View 和底层自动生成 SQL View 的关系讲解

笔者前一篇教程文章,带着大家在 ABAP 系统创建了一个最简单的基于sflight数据库表的 CDS View:本文对这简单的 14 行源代码背后的知识点进行详细讲解。CDS 全称是 Core Data Services,它是一种数据建模技术,帮助开发者以更直观和高层的方式去描述数据库中所需的数据结构。在一个典型的 SAP ABAP 开发场景里,CDS 经常被用来编写各种用于报表、接口或业务逻辑的数据视图。通常,这些视图包含一系列注解。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1026

android 属性android:visibility及 view的setVisibility方法值的意思

此属性意思是此视图是否显示,  例如RelativeLayout中android:visibility="gone" 其有三个属性:visible显示;invisible显示黑背景条;gone不显示 在类中,可以设置其显示与否,setVisibility(View.GONE);不显示 setVisibility(View.VISIBLE);显示 andro

少爷 2万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

android 停止Handler

mHandler.removeCallbacks(mRunnable); 或者 handler.removeMessages(what);

少爷 2万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

自定义Seekbar

效果图: 好了直接上代码: 1:先看布局文件: <com.android.camera.ui.EffectSettingPopupModify xmlns:android="http://schemas.android.com/apk/res/android" style="@style/EffectSettingPopupWindow" an

少爷 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

implements OnClickListener

当程序里面有很多的部件需要点击执行动作的时候可以使用implements OnClickListener 看下面的代码: public class Dong_Home extends TabActivity implements OnClickListener{ @Override protected void onCreate(Bundle savedInstance

少爷 2万+

android isDirectory()及listFiles()

String path="/mnt/sdcard/"; //我随便给的一个目录 File f=new File(path); //new的一个File对象 if(f.isDirectory()){ //如果path表示的是一个目录则返回true //这里要做什么逻辑判断那就是你自己的事了 .... } File[] files =f.listFiles()//获

少爷 1万+

android中handler中 obtainmessge与New message区别

obtainmessage()是从消息池中拿来一个msg 不需要另开辟空间new new需要重新申请,效率低,obtianmessage可以循环利用; //use Handler.obtainMessage(),instead of msg = new Message(); //because if there is already an Message object,that not be

少爷 1万+

android KEYCODE_BACK监听处理

@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyCode == KeyEvent.KEYCODE_BACK ){ showDailog("亲!真的要退出吗?"); } // return super.onKeyDo

少爷 1万+

android:text 文字阴影设置

<TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="text1" android:textSize="35dip" android:text

少爷 1万+

横屏切换竖屏Activity的生命周期及configChanges

曾经遇到过一个面试题,让你写出横屏切换竖屏Activity的生命周期。现在给大家分析一下他切换时具体的生命周期是怎么样的: 1、新建一个Activity,并把各个生命周期打印出来 2、运行Activity,得到如下信息 onCreate--> onStart--> onResume--> 3、按crtl+f12切换成横屏时 onSaveInstanceState-

少爷 9942

Android中全局搜索(QuickSearchBox)详解

原文链接: http://blog.youkuaiyun.com/mayingcai1987/archive/2011/03/21/6265797.aspx  (一) http://blog.youkuaiyun.com/mayingcai1987/archive/2011/03/22/6268732.aspx  (二) http://blog.youkuaiyun.com/mayingcai1987/archive/2011

少爷 8838

重写OnScrollListener实现滚动刷新加载

在做ListView加载数据时如果数据量大的话会造成加载时间过长而卡屏,所以为了解决这个问题,查看了SDK,   在OnScrollListener中有两个方法 只要重写这两个方法就可以实现滚动加载,例如: class MyScrollListener implements OnScrollListener { @Override public void onScroll

少爷 8766

android中的ellipsize设置(省略号的问题)

textview中有个内容过长加省略号的属性,即ellipsize,可以较偷懒地解决这个问题,哈哈~ 用法如下: 在xml中 android:ellipsize = "end"    省略号在结尾 android:ellipsize = "start"   省略号在开头 android:ellipsize = "middle"     省略号在中间 androi

少爷 7439

android过滤隐藏文件FileFilter

File f = Environment.getExternalStorageDirectory();//读取SD卡路径 FileFilter ff = new FileFilter() { public boolean accept(File pathname) { // TODO Auto-generated method stub        return !pathn

少爷 6152
上一篇: Ubuntu 11.04 下真机调试方法
下一篇: AsyncQueryHandler
imdxt1986
博客等级 码龄16年 64粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值