方法一:使用 SharedPreferences
保存数据
布置页面
页面代码如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.black.sq.lesson11.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="注册页面"
android:textSize="15pt"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="97dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用户名:"
android:textSize="10pt"
android:id="@+id/textView2"
android:layout_below="@+id/textView"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="37dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密码:"
android:textSize="10pt"
android:id="@+id/textView3"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/un"
android:layout_alignTop="@+id/textView2"
android:layout_toRightOf="@+id/textView2"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/pw"
android:layout_alignTop="@+id/textView3"
android:layout_toRightOf="@+id/textView3"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存"
android:id="@+id/login"
android:layout_below="@+id/pw"
android:layout_alignLeft="@+id/textView"
android:layout_alignStart="@+id/textView"
android:layout_marginTop="55dp" />
</RelativeLayout>
让数据保存在手机
代码如下:
public class MainActivity extends AppCompatActivity {
private Button login;
private EditText pw;
private EditText un;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
login= (Button) findViewById(R.id.login);
pw= (EditText) findViewById(R.id.pw);
un= (EditText) findViewById(R.id.un);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String pwV=pw.getText().toString().trim();
String unV=un.getText().toString().trim();
SharedPreferences sharedPreferences=getSharedPreferences("datal",1);//xml
SharedPreferences.Editor editor=sharedPreferences.edit();
editor.putString("un",unV);
editor.putString("pw",pwV);
boolean bol=editor.commit();
}
});
}
}
在ADM中看是否保存
将文件导出进行观看
读取数据
修改显示
代码如下:
public class MainActivity extends AppCompatActivity {
private Button login;
private Button read;
private EditText pw;
private EditText un;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
login= (Button) findViewById(R.id.login);
read= (Button) findViewById(R.id.read);
pw= (EditText) findViewById(R.id.pw);
un= (EditText) findViewById(R.id.un);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String pwV=pw.getText().toString().trim();
String unV=un.getText().toString().trim();
SharedPreferences sharedPreferences=getSharedPreferences("datal",1);//xml
SharedPreferences.Editor editor=sharedPreferences.edit();
editor.putString("un",unV);
editor.putString("pw",pwV);
//修改
editor.putString("un","asd");
//删除,根据KEY删除
editor.remove("pw");
//默认把所有都清除
editor.clear();
boolean bol=editor.commit();
}
});
read.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences sharedPreferences=getSharedPreferences("datal",1);
String unV=sharedPreferences.getString("un","no");
String pwV=sharedPreferences.getString("pw","no");
Log.i("message:",unV+"--"+pwV);
}
});
}
}
方法二:使用IO流
布局如上,省略
Main2Activity代码如下:
public class Main2Activity extends AppCompatActivity {
private Button save;
private Button read;
private EditText pw;
private EditText un;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
save= (Button) findViewById(R.id.save);
read= (Button) findViewById(R.id.read);
pw= (EditText) findViewById(R.id.pw);
un= (EditText) findViewById(R.id.un);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String unV=un.getText().toString().trim();
String pwV=pw.getText().toString().trim();
try {
FileOutputStream fileOutputStream= null;
fileOutputStream = openFileOutput("data2",2);//txt
String info=unV+"-"+pwV;
fileOutputStream.write(info.getBytes());
fileOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
read.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
FileInputStream fileInputStream=openFileInput("data2");
byte[] bytes=new byte[1024];
int len=fileInputStream.read(bytes);
//把字节转换为字符串,利用ByteArrayOutputStream
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
byteArrayOutputStream.write(bytes,0,len);
String receive=new String(byteArrayOutputStream.toString());
fileInputStream.close();
Log.i("接受的message:",receive);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
方法三:使用Sqlite数据库
知识点:Sqlite为微型的数据存储方案,内存比较小(比如联系人)
安卓系统自带数据库,存储在内存中(exe)
每一个app都会内置一个Sqlite(属于系统)
要使用Sqlite要创建new自己的库
1.创建一个类,继承 SQLiteOpenHelper
2.onCreate方法(创建表),onUpgrade方法(更改表结构)
当你初始化库的时候就会调用onCreate方法,而且只调用一次
当版本号更改时,会调用onUpgrade方法
Mysqlite代码
public class Mysqlite extends SQLiteOpenHelper {
public Mysqlite(Context context, String name, int version) {
super(context, "lesson11", null, version);
}
//创建表
//当你初始化库的时候就会调用该方法
@Override
public void onCreate(SQLiteDatabase db) {
//id主键 不再是int,而是 Integer 自增用autoincrement
String sql="create table user(id Integer primary key autoincrement,un varchar(30),pw varchar(30))";
db.execSQL(sql);
}
//更改表结构,当版本号更改时,会调用onUpgrade方法
//修改表结构,当版本号有更改时调用(版本号的值只能从小到大)
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
运行打开ADM,找到文件并导出
在SQLiteStudio中查看是否创建成功
3.写Main3Activity 中的逻辑
public class Main3Activity extends AppCompatActivity {
private Button save;
private Button read;
private EditText pw;
private EditText un;
private int version=1;
private SQLiteDatabase sqLiteDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
save= (Button) findViewById(R.id.save);
read= (Button) findViewById(R.id.read);
pw= (EditText) findViewById(R.id.pw);
un= (EditText) findViewById(R.id.un);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String unV=un.getText().toString().trim();
String pwV=pw.getText().toString().trim();
Mysqlite mysqlite=new Mysqlite(Main3Activity.this,"lesson11",version);
sqLiteDatabase= mysqlite.getReadableDatabase();//库才会创建,并且创建表
// String sql="insert into user(un,pw) values ('"+unV+"','"+pwV+"')";
sqLiteDatabase.execSQL("insert into user(un,pw) values ('"+unV+"','"+pwV+"')");
}
});
read.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Mysqlite mysqlite=new Mysqlite(Main3Activity.this,"lesson11",version);
sqLiteDatabase= mysqlite.getReadableDatabase();//库才会创建,并且创建表
//Cursor相当与Resultset
Cursor cursor=sqLiteDatabase.rawQuery("select* from user",null);//第二个参数给?赋值
cursor.moveToNext();//相当于Resultset.next()
String info=cursor.getString(1);//根据列的索引取值,从0开始
Log.i("message",info);
String name=cursor.getColumnName(0);//根据列名取值
Log.i("message",name);
}
});
}
}
注意:版本号只能越来越大,不能改小
否则报错
1.添加数据可以使用 sqLiteDatabase.execSQL()方法,也可以使用sqLiteDatabase.insert()
sqLiteDatabase.execSQL()方法
String sql = "insert into user (un,pw) values('"+unV+"','"+pwV+"')";
boolean bol = false;
sqLiteDatabase.execSQL(sql);
bol = true;
sqLiteDatabase.insert()
ContentValues contentValues = new ContentValues();
contentValues.put("un",unV);
contentValues.put("pw",pwV);
/*p1:表名
p2:赋值为null的列名 有:"列的名字" 没有:null
p3:要插入的数据 把数据整理成类似map的结构
返回值:是新添加成功的数据的主键*/
long i = sqLiteDatabase.insert("user",null,contentValues);
Log.i("message",i+"");
2.修改 数据sqLiteDatabase.update()
/*p3:修改时的条件 where后边的内容*/
int i = sqLiteDatabase.update("user",contentValues,"id = ?",new String[]{"2"});
Log.i("message",i+"");
3.查询数据sqLiteDatabase.query()
注意Cursor 的用法
/*p3:要查找哪些列 p4:条件 p5:对应条件的值*/
Cursor cursor= sqLiteDatabase.query(true,"user",new String[]{"un","pw"},null,null,null,null,"id desc",null);
while(cursor.moveToNext()) {
int count = cursor.getColumnCount();
for(int i = 0;i<count;i++){
String un = cursor.getString(i);
String name = cursor.getColumnName(i);
//map.put()
}
//list.add()
}