Android数据存储

1.SharePreference

SharePreferences是用来存储一些简单配置信息的一种机制,使用Map数据结构来存储数据,以键值对的方式存储,采用了XML格式将数据存储到设备中,文件存放在/data/data/<package name>/shared_prefs目录下。

getSharedPreferences(name,mode)

方法的第一个参数用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上;

方法的第二个参数指定文件的操作模式,共有四种操作模式。

四种操作模式分别为:

1. MODE_APPEND: 追加方式存储

2. MODE_PRIVATE: 私有方式存储,其他应用无法访问

3. MODE_WORLD_READABLE: 表示当前文件可以被其他应用读取

4. MODE_WORLD_WRITEABLE: 表示当前文件可以被其他应用写入

数据的存储和读取案例

public class DataActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_data);
        Button sharePreferenceSaveButton = findViewById(R.id.share_preference_save_button);
        sharePreferenceSaveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences sharedPreferences = getSharedPreferences("xuliwei", Context.MODE_PRIVATE);
                SharedPreferences.Editor editor = sharedPreferences.edit();
                editor.putString("name","xuliwei");
                editor.putInt("age",26);
                editor.commit();//提交修改
            }
        });

        Button sharePreferenceReadButton = findViewById(R.id.share_preference_read_button);
        sharePreferenceReadButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences sharedPreferences = getSharedPreferences("xuliwei", Context.MODE_WORLD_READABLE);
                String name=sharedPreferences.getString("name","");

                int age=sharedPreferences.getInt("age",0);
                Toast.makeText(DataActivity.this, "name:"+name+"age: "+age, Toast.LENGTH_LONG).show();
            }
        });
    }
}

2. SQLite数据库

 数据类型: integer 整型  real 浮点型  text 文本  blob 二进制

SQLite 通过实现SQLiteOpenHelper这个抽象方法实现数据库创建和增删改查

public DatabaseHelper(Context context, String name, CursorFactory factory, int version) 
          context:Context类型,上下文对象 
          name:String类型,数据库的名称 
          factory:CursorFactory类型 
          version:int类型,数据库版本 

 //下面是这个类的几个方法: 
      getReadableDatabase() // 创建或打开一个数据库 可以通过这两个方法返回的SQLiteDatabase对象对数据库进行一系列的操作 

      getWritableDatabase()  //创建或打开一个可以读写的数据库

      onCreate(SQLiteDatabase db)  //第一次创建的时候调用

      onOpen(SQLiteDatabase db)  //打开数据库

      onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)  //升级数据库

      onDowngrade(SQLiteDatabase db,int oldVersion,int newVersion)  //降级数据库

      close()   //关闭所有打开的数据库对象

 getWritableDatabase和getReadableDatabase的区别

getWritableDatabase取得的实例不是仅仅具有写的功能,而是同时具有读和写的功能

同样的,getReadableDatabase取得的实例也是具对数据库进行读和写的功能

两者的区别在于

getWritableDatabase取得的实例是以读写的方式打开数据库,如果打开的数据库磁盘满了,此时只能读不能写,此时调用了getWritableDatabase的实例,那么将会发生错误(异常)

getReadableDatabase取得的实例是先调用getWritableDatabase以读写的方式打开数据库,如果数据库的磁盘满了,此时返回打开失败,继而用getReadableDatabase的实例以只读的方式去打开数据库

onCreate和onUpgrade的区别,当数据库已存在,并已存在某一表格,想要新建一个表,由于表已存在,直接调用onCreate会报错,通常使用onUpgrade先删除表,然后重新调用onCreate重新创建表

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_USER);
        Toast.makeText(mContext, "database 数据库, 新建成功", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists User");
        db.execSQL("drop table if exists Good");
        onCreate(db);
    }

下面分别展开介绍创建数据库、数据库的增删改查

 

public class MyDatabaseHelper extends SQLiteOpenHelper {

    public static final String CREATE_USER = "create table User ("
            + "id integer primary key autoincrement, "
            + "username text, "
            + "height real, "
            + "age integer)";
    public static final String CREATE_Good = "create table User ("
            + "id integer primary key autoincrement, "
            + "name text, "
            + "weight real)";

    private Context mContext;

    public MyDatabaseHelper(Context context, String name,
                            SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_USER);
        Toast.makeText(mContext, "database 数据库, 新建成功", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists User");
        db.execSQL("drop table if exists Good");
        onCreate(db);
    }

}

2.1 创建数据库

MyDatabaseHelper dbHelper = new MyDatabaseHelper(this, "database.db", null, 1);
        Button createDatabase = (Button) findViewById(R.id.create_database);
        //创建数据库database
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dbHelper.getWritableDatabase();
            }
        });

2.2 新增数据

        //增加数据
        Button addData = (Button) findViewById(R.id.add_data);
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                ContentValues values = new ContentValues();
                // 第一条数据
                values.put("username", "xuliwei");
                values.put("height", 179.5);
                values.put("age", 26);
                db.insert("User", null, values); // 插入第一条数据
                values.clear();
                // 第二条数据
                db.execSQL("insert into User(username,height,age) values (?,?,?)",new String[]{"tony","175","26"});
            }
        });

2.3  修改数据

        //更新数据
        Button updateData = (Button) findViewById(R.id.update_data);
        updateData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put("age", 18);
                db.update("User", values, "username = ?", new String[] { "xuliwei" });
                db.execSQL("update User set age = ? where username = ?",,new String[]{"11","tony"});
            }
        });

 2.4  查询数据

//查询数据
        Button queryButton = (Button) findViewById(R.id.query_data);
        queryButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                // 查询User表中所有的数据
//                Cursor cursor = db.query("User", null, null, null, null, null, null);
                Cursor cursor = db.rawQuery("select * from User",null);
                if (cursor.moveToFirst()) {
                    do {
                        // 遍历Cursor对象,取出数据并打印
                        @SuppressLint("Range") String username = cursor.getString(cursor.getColumnIndex("username"));
                        @SuppressLint("Range") double height = cursor.getDouble(cursor.getColumnIndex("height"));
                        @SuppressLint("Range") int age = cursor.getInt(cursor.getColumnIndex("age"));
                        Log.d("MainActivity", "姓名 " + username);
                        Log.d("MainActivity", "身高 " + height);
                        Log.d("MainActivity", "年龄 " + age);
                    } while (cursor.moveToNext());
                }
                cursor.close();
            }
        });

 2.5  删除数据

        //删除数据
        Button deleteButton = (Button) findViewById(R.id.delete_data);
        deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                db.delete("User", "age > ?", new String[] { "18" });
                db.execSQL("delete from User where age > 18");
            }
        });

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值