Android数据存储与IO
来源:互联网 发布:java method的反射 编辑:程序博客网 时间:2024/05/19 03:45
实例一
实例二
实例三
实例四
SharedPredferences与Editor简介
SharedPreferences本身是一个接口,无法直接创建,只能通过getSharedPreferences(String name,int mode)方法获取。
提供如下常用方法:
- boolean contains(String key):
- abstract Map<String , ? >getAll():
- boolean getXxx(String key,xxx defValue):其中xxx可以是boolean,float,int ,long ,String.
- SharedPreferences.Editor clear():
- SharedPreference.Editor putXxx();
- SharedPreference.Editor remove(String key);
- boolean commit();
使用方法:
- SharedPreferences preferences = getSharedPreferences(“aserbao”,MODE_PRIVATE);
- 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卡文件的步骤
- 调用Enviroment的getExternalStorageState()方法判断手机是否插入SD卡,并且应用程序具有读写SD卡的权限
- 调用Enviroment的getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡目录
- 使用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进行数据库操作步骤如下:
- 获取SQLiteDatabase对象,它代表与数据库的连接
- 调用SQLiteDatabase的方法来执行SQL语句
- 调用SQL语句执行结果,比如用SimpleCursorAdapter封装Cursor.
- 关闭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 <table>set key1=value1,key2=value2…… where <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类
方法:
- synchronized SQLiteDatabase getReadableDatabase():
- synchronized SQLiteDatabase getWritableDataable();
- abstract void onCreate(SQLiteDatabase db);
- abstract void onUpdate(SQLiteDatabase db,int oldVersion, int newVersion);
- 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,走上大神之路。
- Android数据存储与IO
- Android数据存储与IO
- Android数据存储与IO
- Android数据存储与IO
- Android数据存储与IO
- Android的数据存储与IO - 手势
- 读书笔记--Android数据存储与文件IO
- Android数据存储与IO详解
- Android开发-数据存储与IO
- Android数据存储与IO.SharedPreferences
- Android数据存储与IO之一 SharedPreference与File存储
- Android 数据存储与IO之File存储
- Android学习笔记十二.Android数据存储与IO.SharedPreferences
- 安卓基础学习_ Android数据存储与IO
- 第8章 Android数据存储与IO
- Android数据存储与IO之二 SQLite数据库
- Android数据存储与IO之三 手势Gesture
- 浅谈Android数据存储与IO之一(Sharepreferences)
- Leetcode——290. Word Pattern
- 集合框架_Map集合的遍历之键找值
- 今年我28岁
- 6.Hibernate检索及抓取策略
- 3-Centos-7-防火墙修改-Firewalld-Iptables
- Android数据存储与IO
- [LeetCode]38. Count and Say
- csr_matrix计算tf
- Django 官方文档write your first Django app --5
- python中的 @ 修饰符
- 关于List的操作
- 【Linux Is Not Unix】centos安装jdk感受
- SSM整合案例
- 对象