本章关于Android 中数据库存储 Shared Preference 存储 和SQLLite
Shared Preference 存储
- Android 提供有个快速保存文件方式,适合小文件保存,存储位置在data->data-><包名>->shared_prefes-> mrsoft.xml
- 获取SharedPreference 对象
3. getSharedPreferences(name, model)
mode: MODE_PRIVATE: 本应用读取
MODE_MULTI_PROCESS: 被跨应用执行
4. getPreferences(mode)
- 获取SharedPrefences.Editor 对象中添加数据
- 提交数据 commit
package com.example.sql_application;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.mingrisoft.R;
public class MainActivity extends AppCompatActivity {
private String mr = "mr", mrsoft = "mrsoft"; //定义后台用户名与密码
private String username, password; //输入的用户名和密码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText usernameET = findViewById(R.id.username);
final EditText passwordET = findViewById(R.id.password);
ImageButton login = (ImageButton) findViewById(R.id.login); //获取登录按钮
final SharedPreferences sharedPreferences = getSharedPreferences("mrsoft",MODE_PRIVATE);
final SharedPreferences.Editor editor = sharedPreferences.edit();
// 获取账号信息
final String username = sharedPreferences.getString("username","mr");
final String password = sharedPreferences.getString("password","mrsoft");
// 实现自动登录
if (sharedPreferences.getString("username", username).equals(mr)
&& sharedPreferences.getString("password", password).equals(mrsoft)) {
Intent intent = new Intent(MainActivity.this, MessageActivity.class); //通过Intent跳转登录后界面
startActivity(intent); //启动跳转界面
}else{
// 实现手动登录
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String in_username = usernameET.getText().toString();
String in_password = passwordET.getText().toString();
if(in_password.equals(password) && in_username.equals(username)){
Toast.makeText(MainActivity.this, "用户名、密码正确", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this, MessageActivity.class);
startActivity(intent);
// 存储账号和密码
editor.putString("username", username); //存储用户名
editor.putString("password", password); //存储密码
editor.commit(); //提交信息
Toast.makeText(MainActivity.this, "已保存用户名密码", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "用户名或密码错误", Toast.LENGTH_SHORT).show();
}
}
});
}
}
}
内部存储
通过JAVA IO流存储到磁盘上
Android: openFileInput()
Android: openFileOutput()
内部存储: 指的是存在data -> data 目录下存储文件 默认只能被创建它的应用访问到,当这个易用卸载后内部文件也就被删除掉了
外部存储 是否插入SDK上数据
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
byte[] buffer = null; //定义保存数据的数组
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText etext = findViewById(R.id.editText); //获取用于填写记事本信息的编辑框组件
ImageButton btn_save = findViewById(R.id.btn_save); //获取保存按钮
ImageButton btn_cancel = findViewById(R.id.btn_cancel); //获取取消按钮
// 第一次打开时候保存数据
btn_save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 保存填写的备忘录信息
FileOutputStream fos = null;
String text = etext.getText().toString();
try {
fos = openFileOutput("memo", MODE_PRIVATE); //获得文件输出流,,并指定文件保存的位置
fos.write(text.getBytes());
fos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) { //输出流不为空时
try {
fos.close(); //关闭文件输出流
Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
});
// 在第二次打开时候保留上次的数据
FileInputStream fis = null;
try {
fis = openFileInput("memo"); //获得文件输入流
buffer = new byte[fis.available()];
fis.read(buffer);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fis != null) { //输入流不为空时
try {
fis.close(); //关闭输入流
String data = new String(buffer); // 获得数组中保存的数据
etext.setText(data); //将读取的数据保存到编辑框中
} catch (IOException e) {
e.printStackTrace();
}
}
}
btn_cancel.setOnClickListener(new View.OnClickListener() { //实现单击取消按钮,退出应用
@Override
public void onClick(View v) {
finish(); //退出应用
}
});
}
}
外部存储
手机连接到电脑上 能被手机识别部分就是外部存储
1. Environment.getExternalStorageDirectory() 获取外部目录和文件
package com.mingrisoft;
import android.app.Activity;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class MainActivity extends Activity {
byte[] buffer = null; //定义保存数据的数组
private File file; //定义存储路径
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText etext = (EditText) findViewById(R.id.editText); //获取用于填写记事本信息的编辑框组件
ImageButton btn_save = (ImageButton) findViewById(R.id.save); //获取保存按钮
ImageButton btn_abolish = (ImageButton) findViewById(R.id.abolish); //获取取消按钮
file = new File(Environment.getExternalStorageDirectory(), "Text.text"); //设置存储sd卡根目录
btn_save.setOnClickListener(new View.OnClickListener() { //实现外部存储填写的文本信息
@Override
public void onClick(View v) {
FileOutputStream fos = null; //定义文件输出流
String text = etext.getText().toString(); //获取文本信息
try {
fos = new FileOutputStream(file); //获得文件输出流,并指定文件保存的位置
fos.write(text.getBytes()); //保存文本信息
fos.flush(); //清除缓存
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close(); //关闭文件输出流
Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
});
//实现第二次打开应用时显示上一次所保存的文本信息
FileInputStream fis = null; //定义文件输入流
try {
fis = new FileInputStream(file); //获得文件输入流
buffer = new byte[fis.available()]; //保存数据的数组
fis.read(buffer); //从输入流中读取数据
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close(); //关闭输入流
String data = new String(buffer); // 获得数组中保存的数据
etext.setText(data); //保存到编辑框中
} catch (IOException e) {
e.printStackTrace();
}
}
}
btn_abolish.setOnClickListener(new View.OnClickListener() { //实现单击取消按钮,退出应用
@Override
public void onClick(View v) {
finish(); //退出应用
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.mingrisoft"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
SQLLite
package com.mingrisoft;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private DBOpenHelper dbOpenHelper; //定义DBOpenHelper
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建DBOpenHelper对象,指定名称、版本号并保存在databases目录下
dbOpenHelper = new DBOpenHelper(MainActivity.this, "dict.db", null, 1);
final ListView listView = (ListView) findViewById(R.id.result_listView); //获取显示结果的ListView
final EditText etSearch = (EditText) findViewById(R.id.search_et); //获取查询内容的编辑框
ImageButton btnSearch = (ImageButton) findViewById(R.id.search_btn); //获取查询按钮
Button btn_add = (Button) findViewById(R.id.btn_add); //获取跳转添加生词界面的按钮
btn_add.setOnClickListener(new View.OnClickListener() { //单击添加生词按钮,实现跳转到添加生词的界面
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, AddActivity.class); //通过Intent跳转添加生词界面
startActivity(intent);
}
});
btnSearch.setOnClickListener(new View.OnClickListener() { //单击查询按钮,实现查询词库中的单词
@Override
public void onClick(View v) {
String key = etSearch.getText().toString(); //获取要查询的单词
//查询单词
Cursor cursor=dbOpenHelper.getReadableDatabase().query("dict",null
,"word = ?",new String[]{key},null,null,null);
ArrayList<Map<String, String>> resultList = new ArrayList<Map<String, String>>(); //创建ArrayList对象,用于保存查询出的结果
while (cursor.moveToNext()) { // 遍历Cursor结果集
Map<String, String> map = new HashMap<>(); // 将结果集中的数据存入HashMap中
// 取出查询记录中第2列、第3列的值
map.put("word", cursor.getString(1));
map.put("interpret", cursor.getString(2));
resultList.add(map); //将查询出的数据存入ArrayList中
}
if (resultList == null || resultList.size() == 0) { //如果数据库中没有数据
// 显示提示信息,没有相关记录
Toast.makeText(MainActivity.this, "很遗憾,没有相关记录!", Toast.LENGTH_LONG).show();
} else {
// 否则将查询的结果显示到ListView列表中
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, resultList,
R.layout.result_main,
new String[]{"word", "interpret"}, new int[]{
R.id.result_word, R.id.result_interpret});
listView.setAdapter(simpleAdapter);
}
}
});
}
@Override
protected void onDestroy() { //实现退出应用时,关闭数据库连接
super.onDestroy();
if (dbOpenHelper != null) { //如果数据库不为空时
dbOpenHelper.close(); //关闭数据库连接
}
}
}
package com.example.myapplication;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
final String CREATE_TABLE_SQL =
"create table dict(_id integer primary " +
"key autoincrement , word , detail)";
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, null, version); //重写构造方法并设置工厂为null
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_SQL); //创建单词信息表
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
System.out.println("---版本更新-----" + oldVersion + "--->" + newVersion);
}
}
content Provider
两个应用程序 之间的消息交流 最重要 数据模型 和 URI
基于数据模型的简单表格提供简答数据模型
content:// com.mingrisoft/person/001
URI : 统一资源标位符
package com.example.myapplication;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
// 从手机的通讯录中获取信息
public class MainActivity extends AppCompatActivity {
// 希望获取姓名
private String columns = ContactsContract.Contacts.DISPLAY_NAME;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.result); //获得布局文件中的TextView组件
tv.setText(getQueryData()); //为TextView设置数据
}
private CharSequence getQueryData(){
StringBuffer sb = new StringBuffer();
ContentResolver resolver = getContentResolver();
// 查询 ContentProvider table 获取到ColumnIndex
Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, null,null,null,null);
// 获取姓名的索引值
int displayNameIndex = cursor.getColumnIndex(columns);
//迭代全部记录
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
String displayName = cursor.getString(displayNameIndex);
sb.append(displayName + "\n");
}
cursor.close(); //关闭Cursor
return sb.toString(); //返回查询结果
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>