博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android数据存储与访问
阅读量:4586 次
发布时间:2019-06-09

本文共 5896 字,大约阅读时间需要 19 分钟。

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      * 数据库版本号,不能小于119      */20     private static int version = 1;21 22     /**23      * @param context24      *            上下文25      * @param name26      *            数据库文件名27      * @param factory28      *            游标工厂29      * @param version30      *            版本号31      */32     public MySqliteHelper(Context context) {33         super(context, stringName, null, version);34     }35 36     /**37      * 数据库创建时的回调方法,初始化表38      */39     @Override40     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     @Override53     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(); 

转载于:https://www.cnblogs.com/diysoul/p/3932519.html

你可能感兴趣的文章
矩阵分解(matrix factorization)
查看>>
大型网站的架构设计与演进
查看>>
‘3 sigma’rule(68–95–99.7 rule)
查看>>
【并发编程】延时初始化
查看>>
编程珠玑--左旋字符串
查看>>
【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十四:储存模块
查看>>
关于js的几道经典题(作用域、原型链等)自己做的
查看>>
【菜鸟学Python】函数的定义及调用
查看>>
宜信微服务任务执行器
查看>>
POJ 2774 Long Long Message 后缀数组
查看>>
datagrid中设置编辑,删除列是否可以访问
查看>>
Linux下I/O复用 Select与Poll
查看>>
python全栈学习--day10(函数进阶)
查看>>
Android初学第19天
查看>>
Flask框架web开发
查看>>
【linux就该这么学】-08
查看>>
JavaScript基础知识汇总
查看>>
PyQt4网格布局
查看>>
PHP学习笔记 - 进阶篇(3)
查看>>
极角排序那些事
查看>>