1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:paddingBottom="@dimen/activity_vertical_margin"
6 android:paddingLeft="@dimen/activity_horizontal_margin"
7 android:paddingRight="@dimen/activity_horizontal_margin"
8 android:paddingTop="@dimen/activity_vertical_margin"
9 tools:context=".MainActivity" >
10 <EditText
11 android:layout_width="fill_parent"
12 android:layout_height="wrap_content"
13 android:id="@+id/account"
14 />
15 <EditText
16 android:layout_width="fill_parent"
17 android:layout_height="wrap_content"
18 android:id="@+id/password"
19 android:layout_below="@id/account"
20 />
21 <Button
22 android:layout_width="fill_parent"
23 android:layout_height="wrap_content"
24 android:layout_below="@id/password"
25 android:text="保存参数"
26 android:id="@+id/save"
27 android:onClick="save"
28 />
29 </RelativeLayout>
这是自定义的Preferences 类,用来实现数据的保存 ,可在Android的内置存储空间产生一文件。
1 import android.R.integer;
2 import android.content.Context;
3 import android.content.SharedPreferences;
4 import android.content.SharedPreferences.Editor;
5 import android.widget.EditText;
6
7 public class Preferences {
8
9 private Context context;
10 public Preferences(Context context)
11 {
12 this.context=context;
13 }
14
15
16 public void save(String name, Integer valueOf)
17 {
18 //保存文件名字为"shared",保存形式为Context.MODE_PRIVATE即该数据只能被本应用读取
19 SharedPreferences preferences=context.getSharedPreferences("shared",Context.MODE_PRIVATE);
20
21 Editor editor=preferences.edit();
22 editor.putString("name", name);
23 editor.putInt("age", valueOf);
24
25 editor.commit();//提交数据
26 }
27
28
29 }
下面是Mainactivity的代码。在activity的oncreate阶段我们加载本地的数据。
import java.util.HashMap;
import java.util.Map;
import android.R.integer;
import android.os.Bundle;
import android.app.Activity;
import android.content.SharedPreferences;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText account,passworad;
Preferences prefer;//自定义的类
SharedPreferences preference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
account=(EditText)findViewById(R.id.account);
passworad=(EditText)findViewById(R.id.password);
//获取本地的数据
preference=getSharedPreferences("shared", MODE_PRIVATE);
Map<String, String> map=new HashMap<String, String>();
map.put("name",preference.getString("name",""));
map.put("age", String.valueOf(preference.getInt("age", 0)));
account.setText(map.get("name"));
passworad.setText(map.get("age"));
}
//保存文件的方法
public void save(View v) {
String name=account.getText().toString();
String age=passworad.getText().toString();
prefer=new Preferences(this);
prefer.save(name,Integer.valueOf(age));
Toast.makeText(getApplicationContext(), "保存完成", Toast.LENGTH_SHORT).show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
点击保存参数,出现保存完成则说明我们已经保存成功了,在下次登录的时候可以看到这些参数还在。因为记录文件是在内置空间中的,所以我们在SD卡中找不到该文件,
如果有root权限的手机可以下载个RE文件管理,我们可以再/data/data/的路径找到很多应用程序的内置文件夹,我们可以在这些文件夹中看到一个shared_prefs文件夹,
里面就有我们刚刚设置而产生的xml文件。
String filename = "myfile";
String string = "Hello world!";
FileOutputStream outputStream;
try{
outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
outputStream.write(string.getBytes());
outputStream.close();
} catch(Exception e) {
e.printStackTrace();
}
总结一下文件相关操作,可以得出以下三个特点:
2.外部存储:
最容易混淆的是外部存储,如果说pc上也要区分出外部存储和内部存储的话,那么自带的硬盘算是内部存储,U盘或者移动硬盘算是外部存储,因此我们很容易带着这样的理解去看待安卓手机,认为机身固有存储是内部存储,而扩展的T卡是外部存储。比如我们任务16GB版本的Nexus 4有16G的内部存储,普通消费者可以这样理解,但是安卓的编程中不能,这16GB仍然是外部存储。
所有的安卓设备都有外部存储和内部存储,这两个名称来源于安卓的早期设备,那个时候的设备内部存储确实是固定的,而外部存储确实是可以像U盘一样移动的。但是在后来的设备中,很多中高端机器都将自己的机身存储扩展到了8G以上,他们将存储在概念上分成了"内部internal" 和"外部external" 两部分,但其实都在手机内部。所以不管安卓手机是否有可移动的sdcard,他们总是有外部存储和内部存储。最关键的是,我们都是通过相同的api来访问可移动的sdcard或者手机自带的存储(外部存储)。
外部存储虽然概念上有点复杂,但也很好区分,你把手机连接电脑,能被电脑识别的部分就一定是外部存储。
外部存储中的文件是可以被用户或者其他应用程序修改的,有两种类型的文件(或者目录):
1.公共文件Public files:文件是可以被自由访问,且文件的数据对其他应用或者用户来说都是由意义的,当应用被卸载之后,其卸载前创建的文件仍然保留。比如camera应用,生成的照片大家都能访问,而且camera不在了,照片仍然在。
如果你想在外存储上放公共文件你可以使用getExternalStoragePublicDirectory()
public File getAlbumStorageDir(String albumName) {
// Get the directory for the user's public pictures directory.
File file = newFile(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), albumName);
if(!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
returnfile;
}
在上面的代码中我们创建获得了存放picture的目录,并且新创建一个albumName文件。
如果你的api 版本低于8,那么不能使用getExternalStoragePublicDirectory(),而是使用Environment.getExternalStorageDirectory(),他不带参数,也就不能自己创建一个目录,只是返回外部存储的根路径。
2.私有文件Private files:其实由于是外部存储的原因即是是这种类型的文件也能被其他程序访问,只不过一个应用私有的文件对其他应用其实是没有访问价值的(恶意程序除外)。外部存储上,应用私有文件的价值在于卸载之后,这些文件也会被删除。类似于内部存储。
创建应用私有文件的方法是Context.getExternalFilesDir(),如下:
public File getAlbumStorageDir(Context context, String albumName) {
// Get the directory for the app's private pictures directory.
File file = newFile(context.getExternalFilesDir(
Environment.DIRECTORY_PICTURES), albumName);
if(!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
returnfile;
}
所有应用程序的外部存储的私有文件都放在根目录的Android/data/下,目录形式为/Android/data/
1、数据库的创建:
private static final String TABLENAME = "student";
private static final String CREATETABLE = "CREATE TABLE " + TABLENAME +
"(_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,age INTEGER)";
public void creatTable(View view){
/**
* 创建数据库
* 参数一:数据库名
* 参数二:模式,一般为MOE_PRIVATE
* 参数三:游标工厂对象,一般写null,表示系统自动提供
*/
SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
db.execSQL(CREATETABLE);
db.close();
}
2、数据库表的创建和数据的添加:
public void insertData(View view){
SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
ContentValues values = new ContentValues();
values.put("name","张三");
values.put("age",18);
/**
*插入数据
* 参数一:要插入的表名
* 参数二:要插入的空数据所在的行数,第三个参数部位空,则此参数为null
* 参数三:要插入的数据
*/
db.insert(TABLENAME,null,values);
ContentValues values1 = new ContentValues();
values1.put("name","李四");
values1.put("age",21);
db.insert(TABLENAME,null,values1);
db.close();
}
3、数据库的更新:
public void updateData(View view){
SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
ContentValues values = new ContentValues();
values.put("name","赵四");
values.put("age",43);
/**
* 数据的更新
* 参数一:要更新的数据所在的表名
* 参数二:新的数据
* 参数三:要更新数据的查找条件
* 参数四:条件的参数
*/
db.update(TABLENAME,values,"_id=?",new String []{"2"});
db.close();
}
4、数据的查找:
public void queryData(View view){
SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
//查询部分数据
Cursor cursor = db.rawQuery("select * from " + TABLENAME + "where name=?",new String []{"张三"});
//查询全部数据
Cursor cursor1 = db.rawQuery("select * from " + TABLENAME ,null);
//将游标移到第一行
cursor1.moveToFirst();
//循环读取数据
while(!cursor1.isAfterLast()){
//获得当前行的标签
int nameIndex = cursor1.getColumnIndex("name");
//获得对应的数据
String name = cursor1.getString(nameIndex);
int ageIndex = cursor1.getColumnIndex("age");
int age = cursor1.getInt(ageIndex);
Log.d(TAG, "name:"+ name +"age: "+age);
//游标移到下一行
cursor1.moveToNext();
}
db.close();
}
5、数据的删除:
public void delectData(View view){
SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
//要删除的数据
db.delete(TABLENAME,"name = ?",new String[]{"赵四"});
db.close();
}
在Andorid系统中所有的文件路径都保存在一个数据库中,位于data/data/com.android.providers.media文件夹下的external.db
里面的files表就有我们需要的内容,这个表包含了机器所有的文件。接下来只要选择合适的sql语句来获取我们需要的内容就行了。
2018-2019-2 20189203 移动平台应用开发实践第十周学习总结
原文:https://www.cnblogs.com/23du/p/10827811.html