关闭

Android数据存储与IO

标签: android数据存储
13055人阅读 评论(5) 收藏 举报
分类:

这里写图片描述 实例一
这里写图片描述 实例二
这里写图片描述 实例三
这里写图片描述 实例四

SharedPredferences与Editor简介

SharedPreferences本身是一个接口,无法直接创建,只能通过getSharedPreferences(String name,int mode)方法获取。

提供如下常用方法:

  1. boolean contains(String key):
  2. abstract Map<String , ? >getAll():
  3. boolean getXxx(String key,xxx defValue):其中xxx可以是boolean,float,int ,long ,String.
  4. SharedPreferences.Editor clear():
  5. SharedPreference.Editor putXxx();
  6. SharedPreference.Editor remove(String key);
  7. boolean commit();

使用方法:

  1. SharedPreferences preferences = getSharedPreferences(“aserbao”,MODE_PRIVATE);
  2. SharedPreferences.Editor edit = preferences.edit();

获取数据代码;

String time = preferences.getString("time", null);
                // 读取int类型的数据
                int randNum = preferences.getInt("random", 0);

存储数据代码:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 "+ "hh:mm:ss");
                // 存入当前时间
                editor.putString("time", sdf.format(new Date()));
                // 存入一个随机数
                editor.putInt("random", (int) (Math.random() * 100));
                // 提交所有存入的数据
                editor.commit();

File存储

实例一代码:

public class MainActivity extends Activity
{
    final String FILE_NAME = "crazyit.bin";
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        System.out.println(new StringBuilder("a").append("b").append("c")
                .toString());
        // 获取两个按钮
        Button read = (Button) findViewById(R.id.read);
        Button write = (Button) findViewById(R.id.write);
        // 获取两个文本框
        final EditText edit1 = (EditText) findViewById(R.id.edit1);
        final EditText edit2 = (EditText) findViewById(R.id.edit2);
        // 为write按钮绑定事件监听器
        write.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View source)
            {
                // 将edit1中的内容写入文件中
                write(edit1.getText().toString());
                edit1.setText("");
            }
        });
        read.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                // 读取指定文件中的内容,并显示出来
                edit2.setText(read());
            }
        });
    }
    private String read()
    {
        try
        {
            // 打开文件输入流
            FileInputStream fis = openFileInput(FILE_NAME);
            byte[] buff = new byte[1024];
            int hasRead = 0;
            StringBuilder sb = new StringBuilder("");
            // 读取文件内容
            while ((hasRead = fis.read(buff)) > 0)
            {
                sb.append(new String(buff, 0, hasRead));
            }
            // 关闭文件输入流
            fis.close();
            return sb.toString();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }
    private void write(String content)
    {
        try
        {
            // 以追加模式打开文件输出流
            FileOutputStream fos = openFileOutput(FILE_NAME, MODE_APPEND);
            // 将FileOutputStream包装成PrintStream
            PrintStream ps = new PrintStream(fos);
            // 输出文件内容
            ps.println(content);
            // 关闭文件输出流
            ps.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

读取SD卡上的文件

读取SD卡文件的步骤

  1. 调用Enviroment的getExternalStorageState()方法判断手机是否插入SD卡,并且应用程序具有读写SD卡的权限
  2. 调用Enviroment的getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡目录
  3. 使用FileInputStream,FileOutputStream,FileReader或FileWriter读写SD卡里的文件。
如果不想使用Enviroment的getExternalStorageState()方法,完全可以使用/mnt/sdcard/路径代表SD卡的路径,然后通过判断/mnt/sdcard/路径是否存在就知道手机是否插入SD卡。

权限:

<!-- 在SD卡中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <!-- 向SD卡写入数据权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

实例二

代码:

public class MainActivity extends Activity
{
    final String FILE_NAME = "/crazyit.bin";
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 获取两个按钮
        Button read = (Button) findViewById(R.id.read);
        Button write = (Button) findViewById(R.id.write);
        // 获取两个文本框
        final EditText edit1 = (EditText) findViewById(R.id.edit1);
        final EditText edit2 = (EditText) findViewById(R.id.edit2);
        // 为write按钮绑定事件监听器
        write.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View source)
            {
                // 将edit1中的内容写入文件中
                write(edit1.getText().toString());
                edit1.setText("");
            }
        });
        read.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                // 读取指定文件中的内容,并显示出来
                edit2.setText(read());
            }
        });
    }
    private String read()
    {
        try
        {
            // 如果手机插入了SD卡,而且应用程序具有访问SD的权限
            if (Environment.getExternalStorageState().equals(
                    Environment.MEDIA_MOUNTED))
            {
                // 获取SD卡对应的存储目录
                File sdCardDir = Environment.getExternalStorageDirectory();
                System.out.println("----------------" + sdCardDir);
                // 获取指定文件对应的输入流
                FileInputStream fis = new FileInputStream(
                        sdCardDir.getCanonicalPath() + FILE_NAME);
                // 将指定输入流包装成BufferedReader
                BufferedReader br = new BufferedReader(new
                        InputStreamReader(fis));
                StringBuilder sb = new StringBuilder("");
                String line = null;
                // 循环读取文件内容
                while ((line = br.readLine()) != null)
                {
                    sb.append(line);
                }
                // 关闭资源
                br.close();
                return sb.toString();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }
    private void write(String content)
    {
        try
        {
            // 如果手机插入了SD卡,而且应用程序具有访问SD的权限
            if (Environment.getExternalStorageState().equals(
                    Environment.MEDIA_MOUNTED))
            {
                // 获取SD卡的目录
                File sdCardDir = Environment.getExternalStorageDirectory();
                File targetFile = new File(sdCardDir
                        .getCanonicalPath() + FILE_NAME);
                // 以指定文件创建 RandomAccessFile对象
                RandomAccessFile raf = new RandomAccessFile(
                        targetFile, "rw");
                // 将文件记录指针移动到最后
                raf.seek(targetFile.length());
                // 输出文件内容
                raf.write(content.getBytes());
                // 关闭RandomAccessFile
                raf.close();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

SQLite数据库

使用SQLiteDatabase进行数据库操作步骤如下:

  1. 获取SQLiteDatabase对象,它代表与数据库的连接
  2. 调用SQLiteDatabase的方法来执行SQL语句
  3. 调用SQL语句执行结果,比如用SimpleCursorAdapter封装Cursor.
  4. 关闭SQLiteDatabase,回收资源

创建数据库和表

db = SQLiteDatabase.openOrCreateDatabase(
                this.getFilesDir().toString()
                        + "/my.db3", null); 

上面代码返回一个SQLiteDatabase对象,该对象的execSQL()可执行任意的SQL语句,可通过如下代码在应用程序中创建表:

db.execSQL("create table news_inf(_id integer"
+ " primary key autoincrement,"+ " news_title varchar(50),"+ " news_content varchar(255))");

实例三代码:

public class MainActivity extends Activity
{
    SQLiteDatabase db;
    Button bn = null;
    ListView listView;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 创建或打开数据库(此处需要使用绝对路径)
        db = SQLiteDatabase.openOrCreateDatabase(
                this.getFilesDir().toString()
                        + "/my.db3", null); // ①
        listView = (ListView) findViewById(R.id.show);
        bn = (Button) findViewById(R.id.ok);
        bn.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View source)
            {
                // 获取用户输入
                String title = ((EditText) findViewById(
                        R.id.title)).getText().toString();
                String content = ((EditText) findViewById(R.id.content))
                        .getText().toString();
                try
                {
                    insertData(db, title, content);
                    Cursor cursor = db.rawQuery("select * from news_inf"
                            , null);
                    inflateList(cursor);
                }
                catch (SQLiteException se)
                {
                    // 执行DDL创建数据表
                    db.execSQL("create table news_inf(_id integer"
                            + " primary key autoincrement,"
                            + " news_title varchar(50),"
                            + " news_content varchar(255))");
                    // 执行insert语句插入数据
                    insertData(db, title, content);
                    // 执行查询
                    Cursor cursor = db.rawQuery("select * from news_inf"
                            , null);
                    inflateList(cursor);
                }
            }
        });
    }
    private void insertData(SQLiteDatabase db
            , String title, String content)  // ②
    {
        // 执行插入语句
        db.execSQL("insert into news_inf values(null , ? , ?)"
                , new String[] {title, content });
    }
    private void inflateList(Cursor cursor)
    {
        // 填充SimpleCursorAdapter
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(
                MainActivity.this,
                R.layout.line, cursor,
                new String[] { "news_title", "news_content" }
                , new int[] {R.id.my_title, R.id.my_content },
                CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);  // ③
        // 显示数据
        listView.setAdapter(adapter);
    }
    @Override
    public void onDestroy()
    {
        super.onDestroy();
        // 退出程序时关闭SQLiteDatabase
        if (db != null && db.isOpen())
        {
            db.close();
        }
    }
}

使用sqlite工具

在Android SDK的platform-tools目录下

常用命令如下:
1. .databases:查看当前数据库
2. .tables:查看当前数据库中的数据表
3. .help:帮助命令

使用特定的方法操作SQLite数据库

使用insert方法插入记录

SQLiteDatabase的insert方法的签名为long insert(String table, String nullColumnHack,ContentValues values),参数说明如下:
1. table:数据表名
2. nullColumnHack:代表强行插入null值的数据列的表名。当values参数为null或不包含key_value对时该参数有效。
3. values:代表一行记录的数据。
insert方法插入的一行记录使用ContentValues存放。

ContentValues values = new ContentValues();
values.put("name","aserbao");
values.put("age",25);
db.insert("表名",null,values);

生成的SQL语句如下:

insert into <表名>(key1,key2…)values(value1,value2…)

使用update方法更新记录

update(String table,ContentValues values,String whereClause,String[] whereArgs);参数说明如下:
1. table:表名
2. valuse:想更新的数据
3. whereClause:代表满足whereClause字句的记录将会被更新
4. whereArgs: 用于whereClause子句传入参数。

ContentValues values = new ContentValues();
values.put("name","imerbao");
int result = db.update("表名",values,"_id>?",new Integer[]{20})

生成的SQL语句如下:

update &lt;table>set key1=value1,key2=value2…… where &lt;whereCluse>

使用Delete方法删除记录

delete(String table,String whereClause,String[] whereArgs)参数说明同上

删除以a开头的人名:

db.delete("表名","person_name like ?",new String[]{"a_"});

对应的SQL语句如下:

delete <table>where <whereClause>

使用query查询记录

Cursor query(boolean distinct,String table,String[] columns,String whereClause,String[] selectionArgs,String groupBy,String having,String orderBy);

distinct:是否去重;
table:表名
columns:需要查出来的列名
whereClause:条件子句
selectionArgs:用于在whereClause子句的占位符传入参数值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。
groupBy:用于控制分组
having:用于对分组进行过滤
orderBy:用于对记录进行排序
limit:用于进行分页
如果想查出表中以i开头的记录,语句如下:

db.query("表名",new String[]{"_id,name,age"}),"name like ?", new String[]{"i%"},null,null,"

SQLiteOpenHelper类

方法:

  1. synchronized SQLiteDatabase getReadableDatabase():
  2. synchronized SQLiteDatabase getWritableDataable();
  3. abstract void onCreate(SQLiteDatabase db);
  4. abstract void onUpdate(SQLiteDatabase db,int oldVersion, int newVersion);
  5. synchronized void close();
    实例四MainActivity代码:
public class MainActivity extends Activity
{
    MyDatabaseHelper dbHelper;
    Button insert = null;
    Button search = null;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 创建MyDatabaseHelper对象,指定数据库版本为1,此处使用相对路径即可
        // 数据库文件自动会保存在程序的数据文件夹的databases目录下
        dbHelper = new MyDatabaseHelper(this, "myDict.db3", 1);
        insert = (Button) findViewById(R.id.insert);
        search = (Button) findViewById(R.id.search);
        insert.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View source)
            {
                // 获取用户输入
                String word = ((EditText) findViewById(R.id.word))
                        .getText().toString();
                String detail = ((EditText) findViewById(R.id.detail))
                        .getText().toString();
                // 插入生词记录
                insertData(dbHelper.getReadableDatabase(), word, detail);
                // 显示提示信息
                Toast.makeText(MainActivity.this, "添加生词成功!"
                        , Toast.LENGTH_LONG).show();
            }
        });
        search.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View source)
            {
                // 获取用户输入
                String key = ((EditText) findViewById(R.id.key)).getText()
                        .toString();
                // 执行查询
                Cursor cursor = dbHelper.getReadableDatabase().rawQuery(
                        "select * from dict where word like ? or detail like ?",
                        new String[] { "%" + key + "%", "%" + key + "%" });
                // 创建一个Bundle对象
                Bundle data = new Bundle();
                data.putSerializable("data", converCursorToList(cursor));
                // 创建一个Intent
                Intent intent = new Intent(MainActivity.this
                        , ResultActivity.class);
                intent.putExtras(data);
                // 启动Activity
                startActivity(intent);
            }
        });
    }
    protected ArrayList<Map<String, String>>
    converCursorToList(Cursor cursor)
    {
        ArrayList<Map<String, String>> result =
                new ArrayList<Map<String, String>>();
        // 遍历Cursor结果集
        while (cursor.moveToNext())
        {
            // 将结果集中的数据存入ArrayList中
            Map<String, String> map = new HashMap<>();
            // 取出查询记录中第2列、第3列的值
            map.put("word", cursor.getString(1));
            map.put("detail", cursor.getString(2));
            result.add(map);
        }
        return result;
    }
    private void insertData(SQLiteDatabase db, String word
            , String detail)
    {
        // 执行插入语句
        db.execSQL("insert into dict values(null , ? , ?)"
                , new String[] {word, detail });
    }
    @Override
    public void onDestroy()
    {
        super.onDestroy();
        // 退出程序时关闭MyDatabaseHelper里的SQLiteDatabase
        if (dbHelper != null)
        {
            dbHelper.close();
        }
    }
}

MyDatabaseHelper代码:

public class MyDatabaseHelper extends SQLiteOpenHelper
{
    final String CREATE_TABLE_SQL =
            "create table dict(_id integer primary " +
                    "key autoincrement , word , detail)";
    public MyDatabaseHelper(Context context, String name, int version)
    {
        super(context, name, null, version);
    }
    @Override
    public void onCreate(SQLiteDatabase db)
    {
        // 第一次使用数据库时自动建表
        db.execSQL(CREATE_TABLE_SQL);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db
            , int oldVersion, int newVersion)
    {
        System.out.println("--------onUpdate Called--------"
                + oldVersion + "--->" + newVersion);
    }
}

ResultActivity代码:

public class ResultActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.popup);
        ListView listView = (ListView) findViewById(R.id.show);
        Intent intent = getIntent();
        // 获取该intent所携带的数据
        Bundle data = intent.getExtras();
        // 从Bundle数据包中取出数据
        @SuppressWarnings("unchecked")
        List<Map<String, String>> list = (List<Map<String, String>>)
                data.getSerializable("data");
        // 将List封装成SimpleAdapter
        SimpleAdapter adapter = new SimpleAdapter(ResultActivity.this
                , list,
                R.layout.line, new String[] { "word", "detail" }
                , new int[] {R.id.word, R.id.detail });
        // 填充ListView
        listView.setAdapter(adapter);
    }
}

自述:

再过两天就要回湖南老家了,2016感觉怎么都没做就结束了,2年多没见爸妈了,这次得回家好好和家人聚聚。基础到位,2017,走上大神之路。

5
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android 数据存储五种方式使用与总结

部分内容来源于官方文档翻译, 对SharedPreferences; 文件存储(内部存储读写,保存编译文件,保存内存缓存文件,外部存储读写); SQLite使用; ContentProvider使用; 网络请求(HttpUrlConnection和HttpClient的GET与POST请求,Andr...
  • Amazing7
  • Amazing7
  • 2016-05-18 16:06
  • 28859

安卓数据存储总结及详解

前言(首先说说什么存储的几个概念) 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的时候又是清除的哪里的数据? 在Android开发中我们常常听到这样几个概念,内存,内部存储,...
  • qq_27280457
  • qq_27280457
  • 2016-06-30 09:27
  • 2554

Android数据存储方式(一)文件

很多时候我们开发的软件需要对处理后的数据进行存储,以供再次访问。Android为数据存储提供了如下几种方式: 1、文件 2、SharedPreferences(偏好参数) 3、SQLite数据库 4、内容提供者(Content provider) 5、网络 本篇介绍第一种存储方式...
  • wulianghuan
  • wulianghuan
  • 2013-02-24 22:18
  • 19389

解读Android之数据存储方案

Android提供了一些永久保存数据的方法,可以根据具体的需求决定使用哪种方式存储,例如私有数据,外部程序是否可以访问等等。有以下几种方法存储:Shared Preferences;Internal Storage;External Storage;SQLite Database;Network C...
  • wangyongge85
  • wangyongge85
  • 2015-09-09 08:54
  • 57693

Android学习笔记十三.Android数据存储与IO.File存储常用API

Android通过一套完整的I/O流体系,包括FileInputStream、FileOutputStream等,通过这些I/O流来访问手机存储上的文件。 一、API 1.File (1)功能:该类提供一些有限的功能-获取或设置文件的权限、文件类型、最后依次修改时间等,通常它所代表的文件名(包含路径...
  • u012637501
  • u012637501
  • 2015-01-07 21:37
  • 1121

android保存到手机内存【数据存储】

小文件,像应用的配置信息等保存到手机内存就行 使用文件进行数据存储 Context.MODE_PRIVATE私有操作模式:文件仅能被本应用访问,数据采用覆盖的方式写入文件 Context.MODE_APPEND追加操作模式:文件仅能被本应用访问,数据采用追加的方式写入文件 C...
  • wei_chong_chong
  • wei_chong_chong
  • 2015-12-24 11:09
  • 829

Android数据存储与IO

Android数据存储与IO   一.SharedPreference—存储简单类型的key-value对(接口)                &#...
  • dqzcq
  • dqzcq
  • 2015-10-04 20:20
  • 140

Android数据存储与IO

一.数据存储         | Context.getSharedPreferences(Stirng name,int mode)获取指定的SharedPreferences实例    ...
  • lbb548246
  • lbb548246
  • 2015-03-18 16:54
  • 237

Android数据存储与IO

Android数据本地存储大致有四种:直接通过IO流进行存储到本地,通过SharedPreferences存储到本地,存储到SD卡,通过SQLite数据库进行存储。 1,直接通过IO流进行存储到本地。 这种方法与java中的存储类似,这里直接给上示例代码: 存储到本地: public static...
  • jh55555
  • jh55555
  • 2014-12-04 11:05
  • 208

Android数据存储于IO

Preface Java IO中的编程经验大部分都可“移植”到Android应用开发商,Android本身也专门提供了一些IO API,通过这些API可以更有效地进行输入输出; 如果应用程序只有少量数据需要保存,那么使用普通文件就可以了;但如果应用程序有大量数据需要存储、访问,就需要借助于...
  • myonelotus
  • myonelotus
  • 2017-04-30 21:36
  • 239
    个人资料
    • 访问:223462次
    • 积分:2135
    • 等级:
    • 排名:千里之外
    • 原创:152篇
    • 转载:4篇
    • 译文:0篇
    • 评论:70条
    博客专栏
    最新评论