zoukankan      html  css  js  c++  java
  • SQLite数据库与Contentprovider(1)

    SQlite:类似mysql的数据库。把数据保存到.db文件夹中。

    Contentprovider:一般用于不同进程之间的数据共享(两个APP)。

    手动建库:http://www.runoob.com/sqlite/sqlite-drop-table.html(命令集手册)

    创建/打开DB文件:

    1. 打开CMD命令行窗口。
    2. Sqlite3 D:/mydb.db

    确保有sqlite3.exe文件(D:sdk oolssqlite3.exe)

    创建Table:

    sqlite> create table peopleinfo (_id integer primary key autoincrement,name text not null,age integer,height float);

    查看Table

    sqlite>.tables

    插入数据到Table中:

        sqlite> insert into peopleinfo values(null,'Tom',21,1.81); 
        sqlite> insert into peopleinfo values(null,'Jim',22,1.78); 
        sqlite> insert into peopleinfo values(null,'Lily',19,1.68); 

    查看Table中的数据:

        select * from peopleinfo; 

    然后也可以用一些where语句后like之类的去过滤数据。

    也可以事先通过.mode column之类的设置一下输出格式。

    相关命令可以通过.help去看看。

    更新Table中的数据:

        sqlite> update peopleinfo set height=1.88 where name="Lily"; 
        sqlite> select * from peopleinfo; 

    删除Table中的单个数据:

        sqlite> delete from peopleinfo where _id=3; 
        sqlite> select * from peopleinfo; 

    删除Table中的所有数据:

    sqlite> delete from peopleinfo

    删除Table:

    sqlite> drop table peopleinfo

    修改Table名:

    sqlite> ALTER TABLE peopleinfo RENAME TO newtable;

    sqlite3工具还支持大量的命令:

    代码建库:

    只要记住以下两个类就可以:

    SQLiteDatabase:类封装了非常多的方法,用以建立、删除数据库,执行SQL命令,对数据进行管理等实质性操作工作。

    SQLiteOpenHelper:这个帮助类可以辅助建立、更新和打开数据库。

      *SQLiteOpenHelper的onUpgrade()是当在数据库需要升级时被调用,一般用来删除旧的数据库表,并将数据转移到新版本的数据库表中。第一次建立(onCreate())数据库时调用。

      *调用SQLiteOpenHelper类的getWritableDatabase()函数和getReadableDatabase()函数。这个两个函数会根据数据库是否存在、版本号和是否可写等情况,决定在返回数据库对象前,是否需要建立数据库。

      *SQLiteDatabase中也封装了打开数据库的函数openDatabases()和创建数据库函数openOrCreateDatabases(),

       因为代码中使用了帮助类SQLiteOpenHelper,从而避免直接调用SQLiteDatabase中的打开和创建数据库的方法,简化了数据库打开过程中繁琐的逻辑判断过程。

    SQLiteOpenHelper的getWritableDatabase():用来建立或打开可读写的数据库对象,一旦函数调用成功,数据库对象将被缓存,任何需要使用数据库对象时,都可以调用这个方法获取到数据库对象,

                            但一定要在不使用时调用close()函数关闭数据库。
    SQLiteOpenHelper的getReadableDatabase():如果保存数据库文件的磁盘空间已满,调用getWritableDatabase()函数则无法获得可读写的数据库对象,这时可以调用getReadableDatabase()函数,获得一个只读的数据库对象。

    数据库操作:

    也就是增删改查。

    ContentValues:把数据已Map的形式打包起来用于数据库的insert,update等操作时以参数形式传递。

    Cursor:在Android系统中,数据库查询结果的返回值并不是数据集合的完整拷贝,而是返回数据集的指针,这个指针就是Cursor类。

    Cursor类的方法和说明:

    其他操作相关方法可以直接看实例来了解,就说明一个参数较多的query():

    Cursor android.database.sqlite.SQLiteDatabase.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)

    下面是实例代码:

    package com.example.demo_sql;
    
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteException;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class DBAdapter {
        private static final String DB_NAME = "people.db";
        private static final String DB_TABLE = "peopleinfo";
        private static final int DB_VERSION = 2;
    
        public static final String KEY_ID = "_id";
        public static final String KEY_NAME = "name";
        public static final String KEY_AGE = "age";
        public static final String KEY_HEIGHT = "height";
    
        private static SQLiteDatabase db;
        private final Context context;
        private static DBOpenHelper dbOpenHelper;
    
        private static class DBOpenHelper extends SQLiteOpenHelper {
    
            public DBOpenHelper(Context context, String name,
                    CursorFactory factory, int version) {
                super(context, name, factory, version);
            }
    
            private static final String DB_CREATE = "create table " + DB_TABLE
                    + " (" + KEY_ID + " integer primary key autoincrement, "
                    + KEY_NAME + " text not null, " + KEY_AGE + " integer,"
                    + KEY_HEIGHT + " float);";
    
            @Override
            public void onCreate(SQLiteDatabase _db) {
                _db.execSQL(DB_CREATE);
            }
    
            @Override
            public void onUpgrade(SQLiteDatabase _db, int _oldVersion,
                    int _newVersion) {
                _db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE);
                onCreate(_db);
            }
        }
    
        public DBAdapter(Context _context) {
            context = _context;
        }
    
        public void open() throws SQLiteException {
            dbOpenHelper = new DBOpenHelper(context, DB_NAME, null, DB_VERSION);
            try {
                db = dbOpenHelper.getWritableDatabase();
            } catch (SQLiteException ex) {
                db = dbOpenHelper.getReadableDatabase();
            }
    
        }
    
        /*
         * public void read() { db = dbOpenHelper.getReadableDatabase(); Cursor
         * cursor = db.query(DB_TABLE, new String[] { KEY_ID, KEY_NAME, KEY_AGE,
         * KEY_HEIGHT }, null, null, null, null, null, null);
         * 
         * while (cursor.moveToNext()) { int id = cursor.getInt(0); //
         * 获取第一列的值,第一列的索引从0开始 String name = cursor.getString(1);// 获取第二列的值 int age =
         * cursor.getInt(2);// 获取第三列的值 float height = cursor.getFloat(3);
         * System.out.println("id:" + id + "  " + "name: " + name + "  " + "age: " +
         * age + "  " + "height: " + height); } cursor.close(); db.close(); }
         * 
         * public static void write() { db = dbOpenHelper.getWritableDatabase();
         * db.execSQL("insert into " + DB_TABLE + "(" + KEY_NAME + "," + KEY_AGE +
         * "," + KEY_HEIGHT + ") values('bb',20,17.6)"); // 使用insert方法向表中插入数据
         * ContentValues values = new ContentValues(); values.put(KEY_NAME, "xh");
         * values.put(KEY_AGE, 5); values.put(KEY_HEIGHT, 5.2); // 调用方法插入数据
         * db.insert(DB_TABLE, null, values); // 关闭SQLiteDatabase对象 db.close(); }
         */
    
        public long insert(People people) {
            ContentValues newValues = new ContentValues();
    
            newValues.put(KEY_NAME, people.Name);
            newValues.put(KEY_AGE, people.Age);
            newValues.put(KEY_HEIGHT, people.Height);
    
            return db.insert(DB_TABLE, null, newValues);
    
        }
    
        public long deleteAllData() {
            return db.delete(DB_TABLE, null, null);
        }
    
        public long deleteOneData(long id) {
            return db.delete(DB_TABLE, KEY_ID + "=" + id, null);
        }
    
        public People[] queryAllData() {
            Cursor results = db.query(DB_TABLE, new String[] { KEY_ID, KEY_NAME,
                    KEY_AGE, KEY_HEIGHT }, null, null, null, null, null);
            return ConvertToPeople(results);
    
        }
    
        public People[] queryOneData(long id) {
            Cursor results = db.query(DB_TABLE, new String[] { KEY_ID, KEY_NAME,
                    KEY_AGE, KEY_HEIGHT }, KEY_ID + "=" + id, null, null, null,
                    null);
            return ConvertToPeople(results);
    
        }
    
        public long updateOneData(long id, People people) {
            ContentValues updateValues = new ContentValues();
            updateValues.put(KEY_NAME, people.Name);
            updateValues.put(KEY_AGE, people.Age);
            updateValues.put(KEY_HEIGHT, people.Height);
    
            return db.update(DB_TABLE, updateValues, KEY_ID + "=" + id, null);
    
        }
    
        private People[] ConvertToPeople(Cursor cursor) {
            int resultCounts = cursor.getCount();
            if (resultCounts == 0 || !cursor.moveToFirst()) {
                return null;
            }
            People[] peoples = new People[resultCounts];
            for (int i = 0; i < resultCounts; i++) {
                peoples[i] = new People();
                peoples[i].ID = cursor.getInt(0);
                peoples[i].Name = cursor.getString(cursor.getColumnIndex(KEY_NAME));
                peoples[i].Age = cursor.getInt(cursor.getColumnIndex(KEY_AGE));
                peoples[i].Height = cursor.getFloat(cursor
                        .getColumnIndex(KEY_HEIGHT));
                cursor.moveToNext();
            }
            return peoples;
    
        }
    
        public void close() {
            if (db != null) {
                db.close();
                db = null;
            }
        }
    
    }
    package com.example.demo_sql;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    public class MainActivity extends Activity implements OnClickListener {
        private DBAdapter dbadapter;
        private EditText et_id;
        private EditText et_name;
        private EditText et_age;
        private EditText et_height;
        private Button bt_insert;
        private Button bt_query;
        private Button bt_clear;
        private Button bt_delete;
        private Button bt_deleteById;
        private Button bt_queryById;
        private Button bt_updateById;
        private EditText displayView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            dbadapter = new DBAdapter(this);
    
            et_id = (EditText) findViewById(R.id.et_id);
            et_name = (EditText) findViewById(R.id.et_name);
            et_age = (EditText) findViewById(R.id.et_age);
            et_height = (EditText) findViewById(R.id.et_height);
    
            bt_insert = (Button) findViewById(R.id.insert_data);
            bt_query = (Button) findViewById(R.id.query_all);
            bt_clear = (Button) findViewById(R.id.clear_all);
            bt_delete = (Button) findViewById(R.id.delete_all);
            bt_insert.setOnClickListener(this);
            bt_query.setOnClickListener(this);
            bt_clear.setOnClickListener(this);
            bt_delete.setOnClickListener(this);
    
            bt_deleteById = (Button) findViewById(R.id.deleteById);
            bt_queryById = (Button) findViewById(R.id.queryById);
            bt_updateById = (Button) findViewById(R.id.updateById);
            bt_deleteById.setOnClickListener(this);
            bt_queryById.setOnClickListener(this);
            bt_updateById.setOnClickListener(this);
    
            displayView = (EditText) findViewById(R.id.displayview);
    
        }
    
        @Override
        protected void onStart() {
            // TODO Auto-generated method stub
            super.onStart();
            dbadapter.open();
        }
    
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (v.getId() == R.id.insert_data) {
                People people = getInsertData();
                if (people != null) {
                    dbadapter.insert(people);
                    printall();
                } else
                    Toast.makeText(this, "Error:Empty data!Please insert data", 0)
                            .show();
            } else if (v.getId() == R.id.query_all) {
                printall();
            } else if (v.getId() == R.id.clear_all) {
                displayView.setText(" ");
            } else if (v.getId() == R.id.delete_all) {
                dbadapter.deleteAllData();
                displayView.setText(" ");
            } else if (v.getId() == R.id.deleteById) {
                long id = Long.valueOf(et_id.getText().toString().trim());
                if (id > 0) {
                    dbadapter.deleteOneData(id);
                    printall();
                }
            } else if (v.getId() == R.id.queryById) {
                long id = Long.valueOf(et_id.getText().toString().trim());
                if (id > 0) {
                    People[] peoples = dbadapter.queryOneData(id);
                    if (peoples != null)
                        printOneData(peoples);
                    else
                        Toast.makeText(this, "Error:not found Exception!", 0)
                                .show();
                }
            } else if (v.getId() == R.id.updateById) {
                long id = Long.valueOf(et_id.getText().toString().trim());
                if (id > 0) {
                    People people = getInsertData();
                    if (people != null)
                        dbadapter.updateOneData(Long.valueOf(id), people);
                    else
                        Toast.makeText(this, "Error:Empty data!Please insert data",
                                0).show();
                    printall();
                }
            }
        }
    
        private void printOneData(People[] peoples) {
            // TODO Auto-generated method stub
    
            displayView.setText(" ");
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < peoples.length; i++) {
                sb.append(peoples[i].toString() + "
    ");
            }
            displayView.setText(sb);
    
        }
    
        private People getInsertData() {
            // TODO Auto-generated method stub
            People people = new People();
            people.setName(et_name.getText().toString());
            people.setAge(Integer.valueOf(et_age.getText().toString()));
            people.setHeight(Float.valueOf(et_height.getText().toString()));
            return people;
        }
    
        private void printall() {
            // TODO Auto-generated method stub
            displayView.setText(" ");
            People[] peoples = dbadapter.queryAllData();
            if (peoples != null) {
                StringBuffer sb = new StringBuffer();
                for (int i = 0; i < peoples.length; i++) {
                    sb.append(peoples[i].toString() + "
    ");
                }
                displayView.setText(sb);
            } else
                Toast.makeText(this, "Error:Empty data!", 0).show();
    
        }
    
        @Override
        protected void onDestroy() {
            // TODO Auto-generated method stub
            super.onDestroy();
            dbadapter.close();
        }
    }
    package com.example.demo_sql;
    
    public class People {
        public int ID = -1;
        public String Name;
        public int Age;
    
        public int getID() {
            return ID;
        }
    
        public void setID(int iD) {
            ID = iD;
        }
    
        public String getName() {
            return Name;
        }
    
        public void setName(String name) {
            Name = name;
        }
    
        public int getAge() {
            return Age;
        }
    
        public void setAge(int age) {
            Age = age;
        }
    
        public float getHeight() {
            return Height;
        }
    
        public void setHeight(float height) {
            Height = height;
        }
    
        public float Height;
    
        @Override
        public String toString() {
            String result = "";
            result += "ID:" + this.ID + ",";
            result += "姓名:" + this.Name + ",";
            result += "年龄:" + this.Age + ", ";
            result += "身高:" + this.Height + ";";
            return result;
        }
    
    }

    布局文件代码也贴上:

    <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:textAlignment="viewStart"
        tools:context=".MainActivity" >
    
        <EditText
            android:id="@+id/et_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_toRightOf="@+id/tv_name"
            android:ems="10"
            android:text=" " >
    
            <requestFocus />
        </EditText>
    
        <EditText
            android:id="@+id/et_age"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/et_name"
            android:layout_alignParentRight="true"
            android:layout_below="@+id/et_name"
            android:ems="10"
            android:text="0" />
    
        <TextView
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/et_name"
            android:layout_alignBottom="@+id/et_name"
            android:layout_alignParentLeft="true"
            android:text="姓名:" />
    
        <TextView
            android:id="@+id/tv_age"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/et_age"
            android:layout_alignBottom="@+id/et_age"
            android:layout_alignParentLeft="true"
            android:text="年龄:" />
    
        <EditText
            android:id="@+id/et_height"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/et_age"
            android:layout_alignParentRight="true"
            android:layout_below="@+id/et_age"
            android:ems="10"
            android:text="0" />
    
        <TextView
            android:id="@+id/tv_height"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/et_height"
            android:layout_alignBottom="@+id/et_height"
            android:layout_alignParentLeft="true"
            android:text="身高:" />
    
        <Button
            android:id="@+id/insert_data"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/tv_height"
            android:minWidth="50dp"
            android:text="添加数据"
            android:textSize="14sp" />
    
        <Button
            android:id="@+id/query_all"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/insert_data"
            android:layout_alignBottom="@+id/insert_data"
            android:layout_toRightOf="@+id/insert_data"
            android:text="全部显示"
            android:textSize="14sp" />
    
        <Button
            android:id="@+id/clear_all"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/query_all"
            android:layout_alignBottom="@+id/query_all"
            android:layout_toRightOf="@+id/query_all"
            android:text="清除显示"
            android:textSize="14sp" />
    
        <Button
            android:id="@+id/delete_all"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@+id/clear_all"
            android:layout_toRightOf="@+id/clear_all"
            android:text="全部删除"
            android:textSize="14sp" />
    
        <EditText
            android:id="@+id/et_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/insert_data"
            android:layout_toLeftOf="@+id/deleteById"
            android:layout_toRightOf="@+id/tv_id"
            android:ems="10"
            android:hint="insert id"
            android:text="0" />
    
        <TextView
            android:id="@+id/tv_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/et_id"
            android:layout_alignBottom="@+id/et_id"
            android:layout_alignParentLeft="true"
            android:text="ID:" />
    
        <Button
            android:id="@+id/deleteById"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/et_id"
            android:layout_alignBottom="@+id/et_id"
            android:layout_toLeftOf="@+id/queryById"
            android:text="ID删除" />
    
        <Button
            android:id="@+id/queryById"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/deleteById"
            android:layout_alignBottom="@+id/deleteById"
            android:layout_toLeftOf="@+id/updateById"
            android:text="ID查询" />
    
        <Button
            android:id="@+id/updateById"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/queryById"
            android:layout_alignBottom="@+id/queryById"
            android:layout_alignParentRight="true"
            android:text="ID更新" />
    
        <EditText
            android:id="@+id/displayview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentRight="true"
            android:layout_below="@+id/deleteById"
            android:ems="10"
            android:gravity="top|left"
            android:inputType="textMultiLine"
            android:textSize="10sp" />
    
    </RelativeLayout>

    运行结果:

    下一节再讲ContentProvider。。。

     

      

  • 相关阅读:
    python操作文件
    匿名函数 列表生成式 字典生成式 递归
    pecan API调用
    lvm磁盘分区
    PasteDeploy部署Pecan API 服务
    oslo_service服务
    python pbr 打包
    stevedore动态加载模块
    mongodb 副本集部署
    python装饰器
  • 原文地址:https://www.cnblogs.com/hongguang-kim/p/5631842.html
Copyright © 2011-2022 走看看