数据库与银行行长(内容提供者)

思路:

一、数据库

①在MainActivity中创建打开数据库帮助类的对象,调用一个可写的数据库

②写一个MyDBOpenHelper类的继承数据库打开帮助类SQLiteOpenHelper,三个方法:构造方法、onCreate和onUpgrade方法

③创建一个银行后门BankDBBackdoor继承内容提供者ContentProvider,提供私有的数据给别的应用程序,创建一个保安(UriMatcher),检查uri的规则,如果uri匹配失败,返回-1。接下来实现增删改查4个方法,实现detele方法,定义一个匹配码,如果匹配成功,创建打开银行数据库帮助类的对象并传入上下文,通过帮助类对象得到一个可写的数据库,然后通过数据库对象调用删除的方法,利用内容提供者的解析器,通知内容观察者数据发生了变化,并且要抛illegelArgumentException异常。增加数据和更改数据的操作与删除操作类似,查询数据操作注意要有返回值,并且数据没有发生变化。

④在数据库的清单文件中,注册内容提供者provider。name为包名.类名,authoritie为主机名


二、银行行长

①实现增删改查点击事件的方法,核心思想是先得到内容提供者的解析器getContentResolver(),然后得到数据库的路径,一般为

"content://主机名/数据库名",然后通过内容解析器调用内容提供者里面的增删改查的方法。

②写增删改查按钮的布局文件并添加点击事件·


【01数据库】在src的Java代码 com.mycode.db.MainActivity
    import android.app.Activity;
    import android.os.Bundle;

    public class MainActivity extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            MyDBOpenHelper helper = new MyDBOpenHelper(this);
            helper.getWritableDatabase();
        }
    }
【01数据库】在src的Java代码 com.mycode.db.MyDBOpenHelper
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;

    public class MyDBOpenHelper extends SQLiteOpenHelper {

        public MyDBOpenHelper(Context context) {
            super(context, "bank.db", null, 1);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("create table account (_id integer primary key autoincrement,name varchar(20),money varchar(20))");
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        }

    }
【01数据库】在src的Java代码 com.mycode.db.BankDBBackdoor
    import android.content.ContentProvider;
    import android.content.ContentValues;
    import android.content.UriMatcher;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.net.Uri;

    /**
     * 内容提供者 后门程序,提供私有的数据给别的应用程序,默认都是空实现.
     */
    public class BankDBBackdoor extends ContentProvider {

        public static final int SUCCESS = 1;
        /**
         * 创建一个保安,检查uri的规则,如果uri匹配失败 返回-1
         */
        static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        static {
            mUriMatcher.addURI("com.itheima.db", "account", SUCCESS);
        }

        @Override
        public int delete(Uri uri, String selection, String[] selectionArgs) {
            int code = mUriMatcher.match(uri);
            if (code == SUCCESS) {
                System.out.println("delete 删除数据");
                MyDBOpenHelper helper = new MyDBOpenHelper(getContext());
                SQLiteDatabase db = helper.getWritableDatabase();
                db.delete("account",selection , selectionArgs);
                //利用内容提供者的解析器,通知内容观察者数据发生了变化
                getContext().getContentResolver().notifyChange(uri, null);
            }else{
                throw new IllegalArgumentException("口令 不正确,滚犊子");
            }
            return 0;
        }

        @Override
        public String getType(Uri uri) {
            return null;
        }

        @Override
        public Uri insert(Uri uri, ContentValues values) {
            int code = mUriMatcher.match(uri);
            if (code == SUCCESS) {
                System.out.println("insert 添加数据");
                MyDBOpenHelper helper = new MyDBOpenHelper(getContext());
                SQLiteDatabase db = helper.getWritableDatabase();
                db.insert("account", null, values);
                //利用内容提供者的解析器,通知内容观察者数据发生了变化
                getContext().getContentResolver().notifyChange(uri, null);
            }else{
                throw new IllegalArgumentException("口令 不正确,滚犊子");
            }
            return null;
        }

        @Override
        public boolean onCreate() {
            return false;
        }

        @Override
        public Cursor query(Uri uri, String[] projection, String selection,
                String[] selectionArgs, String sortOrder) {
            int code = mUriMatcher.match(uri);
            if (code == SUCCESS) {
                System.out.println("query 查询数据");
                MyDBOpenHelper helper = new MyDBOpenHelper(getContext());
                SQLiteDatabase db = helper.getReadableDatabase();
                return db.query("account", projection, selection, selectionArgs, null, null, sortOrder);
            }else{
                throw new IllegalArgumentException("口令 不正确,滚犊子");
            }
        }

        @Override
        public int update(Uri uri, ContentValues values, String selection,
                String[] selectionArgs) {
            int code = mUriMatcher.match(uri);
            if (code == SUCCESS) {
                System.out.println("update 更新数据");
                MyDBOpenHelper helper = new MyDBOpenHelper(getContext());
                SQLiteDatabase db = helper.getWritableDatabase();
                db.update("account", values, selection, selectionArgs);
                //利用内容提供者的解析器,通知内容观察者数据发生了变化
                getContext().getContentResolver().notifyChange(uri, null);
            }else{
                throw new IllegalArgumentException("口令 不正确,滚犊子");
            }
            return 0;
        }

    }
【01数据库】在res/layout/activity_main.xml的写法格式
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />

    </RelativeLayout>
【01数据库】在项目清单文件 AndroidManifest.xml
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.mycode.db"
        android:versionCode="1"
        android:versionName="1.0" >

        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="17" />

        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.mycode.db.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

            <!-- 注册内容提供者数据 -->
            <provider
                android:name="com.mycode.db.BankDBBackdoor"
                android:authorities="com.mycode.db" >
            </provider>
        </application>

    </manifest>

【02银行行长】在src的Java代码 com.mycode.bankboss.MainActivity
    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.view.View;

    public class MainActivity extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }

        /**
         * 银行行长 利用后门 添加一条数据
         */
        public void insert(View view) {
            // 得到内容提供者的解析器
            ContentResolver resolver = getContentResolver();
            Uri uri = Uri.parse("content://com.mycode.db/account");
            ContentValues values = new ContentValues();
            values.put("name", "zhangsan");
            values.put("money", 10000);
            // 通过内容解析器让内容提供者添加一条数据
            resolver.insert(uri, values);
        }

        public void delete(View view) {
            ContentResolver resolver = getContentResolver();
            Uri uri = Uri.parse("content://com.mycode.db/account");
            resolver.delete(uri, "name=?", new String[]{"zhangsan"});
        }

        public void update(View view) {
            ContentResolver resolver = getContentResolver();
            Uri uri = Uri.parse("content://com.mycode.db/account");
            ContentValues values = new ContentValues();
            values.put("money", 20000);
            resolver.update(uri, values, "name=?", new String[]{"zhangsan"});
        }

        public void query(View view) {
            ContentResolver resolver = getContentResolver();
            Uri uri = Uri.parse("content://com.mycode.db/account");
            Cursor cursor = resolver.query(uri, new String[]{"name","money"}, null, null, null);
            while(cursor.moveToNext()){
                String name = cursor.getString(0);
                float money = cursor.getFloat(1);
                System.out.println("name:"+name+"----"+"money:"+money);
            }
            cursor.close();
        }
    }
【01数据库】在res/layout/activity_main.xml的写法格式
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >

        <Button
            android:onClick="insert"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="增" />

        <Button
            android:onClick="delete"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="删" />

        <Button
            android:onClick="update"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="改" />

        <Button
            android:onClick="query"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="查" />

    </LinearLayout>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值