• Android数据存储与访问


    1.文件
        1)保存到手要内存,文件保存到/data/data对应的应用程序包下面
        如    FILE_PATH = "/data/data/com.diysoul.filedemo/info.dat"
        可通过Context的方法取得包名对应的文件夹来保存文件 /data/data/包名/files/
        File fileDir = getFilesDir();
        /data/data/包名/cache/
        getCacheDir();
        再加入文件名来保存文件
        File filePath = new File(fileDir, "info.dat");
        存储
           FileOutputStream fos = new FileOutputStream(FILE_PATH);
           fos.write(stringInput.getBytes());
           fos.flush();
           fos.close();
        读取
           FileInputStream fis = new FileInputStream(FILE_PATH);
           BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
           String strInfo = reader.readLine();

        2)保存到SD卡
        存储和读取SD卡中的数据需要配置权限
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        首先取得SD卡的状态
        String state = Environment.getExternalStorageState();
        if(!Environment.MEDIA_MOUNTED.equals(state))
        {
            return "";
        } 
        取得SD卡的位置
        File fileSDCard = Environment.getExternalStorageDirectory();
        创建文件
        File file = new File(fileSDCard, FILE_NAME); 
        存储
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(stringInput.getBytes());
        fos.flush();
        fos.close();
        读取
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));     
        reader.readLine();

        3).使用Context的方法保存文件
        相关方法在 /data/data/包名/files/ 下创建文件
        FileOutputStream fos = context.openFileOutput(FILE_NAME, mode);
        FileInputStream fis = context.openFileInput(FILE_NAME);
        FILE_NAME用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android会自动创建它。创建的文件保
        存在/data/data/<package name>/files目录
        mode指定用于指定操作模式,   
        Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖
        原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
        Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
        MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
        MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
        如果希望文件被其他应用读和写,可以传入:
        openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

        注意:1).模拟器如果未指定SD卡的大小,则state将返回removed,表示没有SD卡!
                   2).android文件权限在DDMS中可以看到
        android文件权限
        - --- --- ---
        第1位:d为文件夹,-为普通文件,l为挂载某一个文件
        第2-4位:代表当前用户的权限,如 rw- = 110 = 6
        第5-7位:代表当前用户所在组的其它组员的权限
        第8-10位:代表所有的权限
        ---没有任何权限,r--可读,-w-可写,rw-可读可写,--x可执行

    2.使用SharedPreferences对象
        创建文件时默认会添加后缀名xml
        存储
        // 文件保存在 /data/data/包名/shared_prefs/
        SharedPreferences sharePreference = context.getSharedPreferences(
        FILE_NAME, Context.MODE_APPEND);
        // 取得Editor对象
        Editor editor = sharePreference.edit();
        // 写入数据
        editor.putString(INFO, stringInput);
        // 提交,保存到物理磁盘
        editor.commit();
        读取
        // 文件保存在 /data/data/包名/shared_prefs/
        SharedPreferences sharePreference = context.getSharedPreferences(FILE_NAME, Context.MODE_APPEND);
        // 读数据
        String result = sharePreference.getString(INFO, ""); 
        权限同上 

    3.数据库SQLite3
        1).通过继承SQLiteOpenHelper类开发子类,使用getReadableDatabase和getWritableDatabase方法取得数据库对象,操作数据库。开发者需要做的只是重写两个方法即可。
      
     1 package com.diysoul.sqlitedemo.db;
     2 
     3 import android.content.Context;
     4 import android.database.sqlite.SQLiteDatabase;
     5 import android.database.sqlite.SQLiteOpenHelper;
     6 
     7 /**
     8  * @author John 数据库帮助类,用于创建和管理数据库
     9  */
    10 public class MySqliteHelper extends SQLiteOpenHelper {
    11 
    12     /**
    13      * 数据库文件名称
    14      */
    15     private static String stringName = "Person.db";
    16 
    17     /**
    18      * 数据库版本号,不能小于1
    19      */
    20     private static int version = 1;
    21 
    22     /**
    23      * @param context
    24      *            上下文
    25      * @param name
    26      *            数据库文件名
    27      * @param factory
    28      *            游标工厂
    29      * @param version
    30      *            版本号
    31      */
    32     public MySqliteHelper(Context context) {
    33         super(context, stringName, null, version);
    34     }
    35 
    36     /**
    37      * 数据库创建时的回调方法,初始化表
    38      */
    39     @Override
    40     public void onCreate(SQLiteDatabase db) {
    41         // 操作数据库
    42         //1.创建表
    43         String sql = "create table person(_id integer primary key autoincrement, name varchar(20), age interger);";
    44         db.execSQL(sql);
    45         //AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY (code 1): , while compiling: create table person(id interger primary key autoincrement, name varchar(20), age interger);
    46 
    47     }
    48 
    49     /**
    50      * 数据库版本号更新时回调此方法,更新数据库的内容,包括增加表,删除表,或修改表
    51      */
    52     @Override
    53     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    54     }
    55 
    56 }

      对于sql语句,在java代码中无法检查出错误,可以在PC端数据库软件SQLite Expert Personal 3(百度盘有备份)中运行,确认没有问题再添加到代码中,将需要动态传入的参数用‘?’代替,加入参数即可。
        // 1.创建表
        create table person(_id integer primary key autoincrement, name varchar(20), age interger);
        // 2.插入数据
        insert into person(name, age) values('lsi', 24);
        insert into person(name, age) values('王二', 24);
        db.execSQL("insert into person(name, age) values(?, ?);",
            new Object[] { person.getName(), person.getAge() });
        // 3.删除数据
        delete from person where _id = 2;
        db.execSQL("delete from person where _id = ?;", new Object[] { id });
        // 4.更新数据
        update person set name = 'tt' where name = '王二'
        update person set name = 'zhangshan' where name = 'tt'
        db.execSQL("update person set name = ?, age = ? where _id = ?;",
                new Object[] { person.getName(), person.getAge(),
             person.getId() });
        // 5.查询数据
        select * from person;
        select * from person where _id > 2;
        Cursor cursor = db.rawQuery("select _id, name, age from person;", null);
        Cursor cursor = db.rawQuery("select _id, name, age from person where _id = ?;",
             new String[] { String.valueOf(id) });
        通过cursor读出需要的数据
            if (cursor != null && cursor.getCount() > 0) {
                int id;
                String name;
                int age;
                while (cursor.moveToNext()) {
                    id = cursor.getInt(0);// 第0列 对应 _id
                    name = cursor.getString(1); // 第1列 对应 name
                    age = cursor.getInt(2); // 第2列 对应 age
                    list.add(new Person(id, name, age));
                }
         }
         //查询一条语句
         if (cursor != null && cursor.moveToFirst()) {
                id = cursor.getInt(0); // 对应 _id
                String name = cursor.getString(1); // 对应 name
                int age = cursor.getInt(2); // 对应 age
                person = new Person(id, name, age);
            }
        db对象:
        MySqliteHelper mySqlHelper;
        SQLiteDatabase db = mySqlHelper.getWritableDatabase();
        //注意,每一次操作之后都需要关闭数据库
        db.close(); 

    代码养活自己
  • 相关阅读:
    PHP include寻找文件规则
    go实现聊天系统(三)
    go实现聊天系统(二)
    题解 UVA10298 【Power Strings】
    单源最短路SPFA
    css面试题
    【笔记】随笔记录
    【form】表单提交方式
    【CSS】常用css
    【Appcan】常用随笔
  • 原文地址:https://www.cnblogs.com/diysoul/p/3932519.html
Copyright © 2020-2023  润新知