zoukankan      html  css  js  c++  java
  • Android开发手记(18) 数据存储三 SQLite存储数据

    Android为数据存储提供了五种方式:

    1、SharedPreferences

    2、文件存储

    3、SQLite数据库

    4、ContentProvider

    5、网络存储

          SQLite 是以嵌入式为目的而设计的轻型数据库,运行起来占用的资源非常低,通常只需要几百K的内存就足够了。同时也具有非常好的兼容性,支持标准SQL语言。Android提供了对SQLite的支持,我们可以通过其来管理一些应用数据。

    一、创建SQLite数据库和表

          我们可以通过SQLiteDatabase.openOrCreateDatabase()来创建一个数据库实例。

    SQLiteDatabase db = openOrCreateDatabase(dbName, MODE_PRIVATE, null);
    // openOrCreateDatabase(String name, int mode, CursorFactory factory)
    // 第一个参数为创建数据库的名称
    // 第二个参数为创建数据库的权限,其权限同内部文件存储数据权限相同。默认为MODE_PRIVATE。
    // 第三个参数为CursorFactory对象,用于查询时返回Cursor的子类对象;或者传入null使用默认的factory构造。
    
    

           在创建表的时候,我们可以使用一条SQL语句来完成。

    cmd = "CREATE TABLE IF NOT EXISTS " + tableName + " (name VARCHAR, passwd VARCHAR)";
    db.execSQL(cmd);

          这样,我们可以发现在“/data/data/[PACKAGE_NAME]/databases”目录下生成了一个“myDB.db”数据库文件。

          完整代码:

    import android.database.sqlite.SQLiteDatabase;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity {
    
        private Button btnDB;
        private Button btnTable;
        private String dbName = "myDB";
        private String cmd = "";
        private SQLiteDatabase db;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            btnDB = (Button)findViewById(R.id.btnDB);
            btnTable = (Button)findViewById(R.id.btnTable);
    
            btnDB.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    db = openOrCreateDatabase(dbName,MODE_PRIVATE,null);
                }
            });
            btnTable.setOnClickListener(new View.OnClickListener() {
                String tableName = "User";
                @Override
                public void onClick(View view) {
                    cmd = "CREATE TABLE IF NOT EXISTS " + tableName + " (name VARCHAR, passwd VARCHAR)";
                    db.execSQL(cmd);
                }
            });
    
        }
    }
    

    二、添加、删除、修改

          (1)SQL语句方法

    cmd = "INSERT INTO " + tableName + " values ('Amy','123456')";
    db.execSQL(cmd);
    cmd = "UPDATE " + tableName + " SET passwd='654321' WHERE name='AMY')";
    db.execSQL(cmd);
    cmd = "DELETE FROM " + tableName + " WHERE name='Amy'";
    db.execSQL(cmd);

          (2)另一种方法

    db.insert(String table, String nullColumnHack, ContentValues values);
    db.update(String table, Contentvalues values, String whereClause, String whereArgs);
    db.delete(String table, String whereClause, String whereArgs);

          以上三个方法的第一个参数都是表示要操作的表名;insert中的第二个参数表示如果插入的数据每一列都为空的话,需要指定此行中某一列的名称,系统将此列设置为NULL,不至于出现错误;insert中的第三个参数是ContentValues类型的变量,是键值对组成的Map,key代表列名,value代表该列要插入的值;update的第二个参数也很类似,只不过它是更新该字段key为最新的value值,第三个参数whereClause表示WHERE表达式,比如“age > ? and age < ?”等,最后的whereArgs参数是占位符的实际参数值;delete方法的参数也是一样。

          实例:

    	btnTable.setOnClickListener(new View.OnClickListener() {
                String tableName = "User";
    
                @Override
                public void onClick(View view) {
                    cmd = "CREATE TABLE IF NOT EXISTS " + tableName + " (name VARCHAR, passwd VARCHAR)";
                    db.execSQL(cmd);
    
                    ContentValues cv = new ContentValues();
                    cv.put("name", "Amy");
                    cv.put("passwd", "123456");
                    db.insert(dbName, null, cv);
    //              cmd = "INSERT INTO " + tableName + " values ('Amy','123456')";
    //              db.execSQL(cmd);
    
                    cv = new ContentValues();
                    cv.put("passwd", "654321");
                    db.update(dbName, cv, "name=?", new String[]{"Amy"});
    //              cmd = "UPDATE " + tableName + " SET passwd='654321' WHERE name='AMY')";
    //              db.execSQL(cmd);
    
                    db.delete(dbName, "name=?", new String[]{"Amy"});
    //              cmd = "DELETE FROM " + tableName + " WHERE name='Amy'";
    //              db.execSQL(cmd);
                }
            });

    三、数据库查询

          对数据库的查询可以通过db.query()来实现,query方法一般包含8个参数:

    db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);
    // table为查询表的名称
    // columns为查询的字段名
    // selection为查询的条件
    // selectionArgs为查询条件的值
    // groupBy为分组字段值
    // having为分组后筛选条件
    // orderBy为排序字段名
    // limit为查询结果返回记录条数

         查询的的结果通过Cursor返回。代表数据集的游标。

    		Cursor cursor = db.query(tableName, null, null, null, null, null, null);
                    String str = "";
                    if(cursor.getCount()!=0){                       // 查询符合条件的记录个数
                        cursor.moveToFirst();                       // 移动到第一个记录
                        for(int i=0; i<cursor.getCount();i++){
                            str += cursor.getString(0)+" "+cursor.getString(1)+"
    ";
                            cursor.moveToNext();                    // 移动到下一个记录
                        }
                    }
                    new AlertDialog.Builder(MainActivity.this).setTitle("Query")
                            .setMessage(str).setNegativeButton("OK",null).show();

    四、SQLiteOpenHelper

          除了常规的管理方法之外,Android SDK还提供了另外一种管理数据库的方法,SQLiteOpenHelper。它提供了一套自动执行的机制来创建、更新、打开数据库。

          首先,我们继承SQLiteOpenHelper类,创建MyDBHelper类。

    public class MyDBHelper extends SQLiteOpenHelper {
        private String tableName = "User";
    
        public MyDBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
        }
    
        public void onCreate(SQLiteDatabase db) {
            String cmd = "CREATE TABLE IF NOT EXISTS " + tableName + " (name VARCHAR, passwd VARCHAR)";
            db.execSQL(cmd);
        }
    
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            String cmd = "UPDATE " + tableName + " SET passwd='654321' WHERE name='AMY')";
            db.execSQL(cmd);
        }
    
        public String showTable(){
            SQLiteDatabase db = this.getReadableDatabase();
            Cursor cursor = db.query(tableName, null, null, null, null, null, null);
            String str = "";
            if(cursor.getCount()!=0){                       // 查询符合条件的记录个数
                cursor.moveToFirst();                       // 移动到第一个记录
                for(int i=0; i<cursor.getCount();i++){
                    str += cursor.getString(0)+" "+cursor.getString(1)+"
    ";
                    cursor.moveToNext();                    // 移动到下一个记录
                }
            }
            return str;
        }
    
    }

          然后,我们便可以在MainActivity内使用我们定义的SQLiteOpenHelper类的方法。

    	btnShow = (Button) findViewById(R.id.btnShow);
            btnShow.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    dbHelper = new MyDBHelper(MainActivity.this, dbName, null, 1);
                    new AlertDialog.Builder(MainActivity.this).setTitle("MyDBHelper")
                            .setMessage(dbHelper.showTable()).setNegativeButton("OK", null).show();
                }
            });

          完整代码如下:

    MainActivity.java

    import android.app.AlertDialog;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity {
    
        private Button btnShow;
        private String dbName = "myDB";
        private MyDBHelper dbHelper;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            btnShow = (Button) findViewById(R.id.btnShow);
            btnShow.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    dbHelper = new MyDBHelper(MainActivity.this, dbName, null, 1);
                    new AlertDialog.Builder(MainActivity.this).setTitle("MyDBHelper")
                            .setMessage(dbHelper.showTable()).setNegativeButton("OK", null).show();
                }
            });
        }
    
    }

    MyDBHelper.java

    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class MyDBHelper extends SQLiteOpenHelper {
        private String tableName = "User";
    
        public MyDBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
        }
    
        public void onCreate(SQLiteDatabase db) {
            String cmd = "CREATE TABLE IF NOT EXISTS " + tableName + " (name VARCHAR, passwd VARCHAR)";
            db.execSQL(cmd);
        }
    
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            String cmd = "UPDATE " + tableName + " SET passwd='654321' WHERE name='AMY')";
            db.execSQL(cmd);
        }
    
        public String showTable(){
            SQLiteDatabase db = this.getReadableDatabase();
            Cursor cursor = db.query(tableName, null, null, null, null, null, null);
            String str = "";
            if(cursor.getCount()!=0){                       // 查询符合条件的记录个数
                cursor.moveToFirst();                       // 移动到第一个记录
                for(int i=0; i<cursor.getCount();i++){
                    str += cursor.getString(0)+" "+cursor.getString(1)+"
    ";
                    cursor.moveToNext();                    // 移动到下一个记录
                }
            }
            return str;
        }
    
    }
  • 相关阅读:
    洛谷——P1970 花匠
    洛谷—— P1969 积木大赛
    洛谷——P1966 火柴排队
    洛谷——P1965 转圈游戏
    python练习-跳出多层循环和购物车
    WinCE设置多国语言支持
    java开发环境搭建
    MCC(移动国家码)和 MNC(移动网络码)
    技术团队新官上任之基层篇
    技术团队新官上任之中层篇
  • 原文地址:https://www.cnblogs.com/doodle777/p/4921868.html
Copyright © 2011-2022 走看看