第五章数据存储
一.数据存储方式
(5种)
二.文件存储
openFileoutput写
openFileInput读
(1)内部存储写操作
将content内容写入fileName文件里,利用openFileOutput要记得要写模式!
(2)外部存储写操作
有四个重要函数
(a)
Evironment.getExternalStorageState()
对于外部存储(SD卡存储)进行写操作时要先获取当前外部设备状态Evironment.getExternalStorageState()
(b).equals(Environment.MEDIA_MOUNTED)
当前外部设备是否可用
如果返回值真那就是可用
最后判断当前android版本号
如果大于29
用getExternalFilesDir(null)
如果小于等于29
用Environment.getExternalStorageDirectory()
外部存储SD卡写文件的权限:
(3)内部存储读操作
利用android方法openFileInput
先创建输入流FileInputStream 名称=openFileInput(文件名);
byte[]buffer=new byte[缓冲区长度];//缓冲区长度也就是文件长度
然后用缓冲区byte数组存放fis.read(buffer);
最后利用String变量读出!
(4)外部存储读操作
利用java的io流进行读
三.sqlite数据库存储
sqlite是一个轻量型数据库是android自带的。
创建一个MyHelper类继承SQLiteOpenHelper类
在里面重写构造方法(用的是父类构造方法)
重写onCreate方法里面是创建数据库表语句如果有数据库就不用
重写数据库版本号增加(更新数据库)
完整代码分析:对sqlite增删改查
主活动
数据库bank里面有个account表。
MainActivity.javapackage com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {//默认有
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void create(View v){//首先创建数据库对象
MyDbHelper helper = new MyDbHelper(MainActivity.this, "bank", null, 1);//这条语句只是创建了helper对象,但是数据库没真创建成功
SQLiteDatabase db = helper.getReadableDatabase();//要调用getReadableDatabase或者getWritableDatabase才会真正使用数据库(前一个只读,后一个只写)
db.close();
} //增
public void add(View v){
MyDbHelper helper = new MyDbHelper(MainActivity.this, "bank", null, 1);//bank数据库名称
SQLiteDatabase db = helper.getWritableDatabase();
for(int i=0; i<10; i++){
ContentValues values = new ContentValues();
values.put("name", "person"+i );//用values存放一行记录。第一个参数属性名,第二个参数属性值。
values.put("money", 5000);
long id = db.insert("account",null, values);//插入,(表名,当插入行为空会插入null,插入记录)
}
db.close();
}
public void delete(View v){
MyDbHelper helper = new MyDbHelper(MainActivity.this, "bank", null, 1);
SQLiteDatabase db = helper.getWritableDatabase();
int number = db.delete("account", "_id=?", new String[]{"3"});//删除_id为3的
Log.i("SQLite:", number+"");
number = db.delete("account", "money=?", new String[]{"3000"});//删除money为3000的
Log.i("SQLite:", number+"");
db.close();
}
public void update(View v){
MyDbHelper helper = new MyDbHelper(MainActivity.this, "bank", null, 1);
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("money", 3000);
int number = db.update("account", values, "name =?", new String[]{"person0"});//将account表里person0的钱改为3000 Log.i("SQLite:", number+"");
values.put("money", 3500);
number = db.update("account", values, "name =?", new String[]{"person6"});
Log.i("SQLite:", number+"");
values.put("money", 6000);
number = db.update("account", values, "name =?", new String[]{"person9"});
Log.i("SQLite:", number+"");
db.close();
} //查询(只有查询需要自己写log.i()进行显示结果,增删改可以修改后用sql语句在控制台显示)
public void query(View v){
MyDbHelper helper = new MyDbHelper(MainActivity.this, "bank", null, 1);
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query("account", null, "money=?", new
String[]{"0"},null, null, null);//查询钱为0的全部记录
while (cursor.moveToNext()) {//循环输出
@SuppressLint("Range") int _id = cursor.getInt(cursor.getColumnIndex("_id"));
Log.i("SQLite:", _id+"");
@SuppressLint("Range") String name = cursor.getString(cursor.getColumnIndex("name"));
Log.i("SQLite:", name);
@SuppressLint("Range") int money = cursor.getInt(cursor.getColumnIndex("money"));
Log.i("SQLite:", money+"");
}
if (cursor.getCount() == 0) {//假如没有满足条件记录
Log.i("SQLite:", "No such data");
}
db.close();
}//Cursor cursor = db.query("account", null, "money=?", newString[]{"0"},null, null, null);七个参数
public void transfer(View v){
MyDbHelper helper = new MyDbHelper(MainActivity.this, "bank", null, 1);
SQLiteDatabase db = helper.getWritableDatabase();
db.beginTransaction();
try {
db.execSQL("update account set money = money-1000 where name =?", new Object[] { "person4" });//名称为person4的记录将钱数-1000
db.execSQL("update account set money = money +1000 where name =?", new Object[] { "person6" });
db.setTransactionSuccessful();
}catch (Exception e) {
Log.i("Transfer failed!", e.toString());//处理异常
} finally {
db.endTransaction();
db.close();
}
}
} 数据库事务
transaction指的是数据库事务-->针对数据库的一组操作
首先开启数据库事务beginTransaction()
然后execSQL(SQL语句对数据库进行操作)
setTransactionSuccessful成功创建数据库事务并做标记
最后在finally里面关闭数据库事务endTransaction();如果有标记那就成功创建数据库事务提交数据,否则失败就回滚。
创建数据库类
MyDbHelper.javapackage com.example.myapplication;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class MyDbHelper extends SQLiteOpenHelper {
public MyDbHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int
version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE account(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20), money INTEGER)");//account是表名,_id为主键且自动增长(从id=1开始)
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
创建数据库类的方法: 先定义这个数据库类他继承SQLiteOpenHelper 然后这个类里面有三个方法 (1)自己的构造方法 public 数据库类名称(Context 名称,String name,SQLiteDatabase.CursorFactory factory,int version)//四个参数分别是上下文名称,数据库名称,游标工厂号一般用null,版本号,除了上下文其他都可以省略。{ super(使用参数的参数值);//按顺序给四个参数赋值,如果在参数列表中没定义就传入一个固定值,否则传入参数名,顺序是从左到右上下文名称,数据库名称,游标工厂号通常为null,最后数据库版本号。 } (2)onCreate方法 写创建表语句 (3)版本号升级onUpdate(数据库,旧版本号,新版本号) 总结--对sqlite数据库增删改查 public void 名称(View v){
MyDbHelper helper = new MyDbHelper(MainActivity.this, 数据库名称, null, 1);////四个参数分别是上下文名称,数据库名称,游标工厂号一般用null,版本号
SQLiteDatabase db = helper.getReadableDatabase();//查询用getReadableDatabase(),增删改用getWritableDatabase() ...} 如果想在java中直接用sql语句对数据库操作:
db是SQLiteDatabase 数据库
标签:存储,java,--,数据库,db,第五章,new,import,null From: https://www.cnblogs.com/luckyhappyyaoyao/p/18170795