首页 > 其他分享 >第五章--数据存储

第五章--数据存储

时间:2024-05-05 11:34:25浏览次数:18  
标签:存储 java -- 数据库 db 第五章 new import null

第五章数据存储

一.数据存储方式

(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.java
package 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.java
package 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

相关文章

  • 在 Apple silicon Mac 上 DFU 模式修复或恢复 macOS 固件 (2024年5月更新)
    在ApplesiliconMac上DFU模式修复或恢复macOS固件搭载Apple芯片的Mac电脑DFU模式全新安装macOSSonoma请访问原文链接:在ApplesiliconMac上DFU模式修复或恢复macOS固件,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgMaccomputerswithApple......
  • NVIDIA的Isaac AMR产品介绍
    NVIDIA的IsaacAMR是仓库自动运货机器人项目,说直白些就是一个AGV的小车,不过和传统的AGV不同,NVIDIA推出的这个产品是智能化的。传统AGV小车的运行代码都是写死的,直接把运行命令写到了AGV里面,然后这个小车就只能按照预先的设定来进行运行,但是NVIDIA的这个产品是智能化的,是可以根据实......
  • Adobe InDesign 2024 v19.4 (macOS, Windows) - 版面设计和桌面出版软件
    AdobeInDesign2024v19.4(macOS,Windows)-版面设计和桌面出版软件Acrobat、AfterEffects、Animate、Audition、Bridge、CharacterAnimator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、LightroomClassic、MediaEncoder、Photoshop、PremierePro、Adob......
  • Adobe InCopy 2024 v19.4 (macOS, Windows) - 编写和副本编辑软件
    AdobeInCopy2024v19.4(macOS,Windows)-编写和副本编辑软件Acrobat、AfterEffects、Animate、Audition、Bridge、CharacterAnimator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、LightroomClassic、MediaEncoder、Photoshop、PremierePro、AdobeXD......
  • Linux 使用 inotify 监控文件或目录变化
    转载:https://www.cnblogs.com/PikapBai/p/14480881.html作者:PikapBai 1运行环境#操作系统:Ubuntu182inotify简介#inotify是一个Linux内核特性(监视文件系统事件),它用于监控文件系统,比如删除、读、写操作等,当发生对应事件时,则会触发inotify。当监控目录时,与该目录......
  • CF-877-E-dfs序+线段树
    877-E题目大意给定一颗\(n\)个节点的树,根为\(1\),点带权,权值要么为0,要么为1。\(q\)次询问,两种类型:\(get\spacex\):询问\(x\)的子树中有多少个\(1\)。\(pow\spacex\):将\(x\)子树中所有的值取反。Solutiondfs序+线段树模板题,把子树上的操作转化为区间上的操作。时间......
  • 工业通讯协议(一)- CAN
    一:概述CAN协议,全称为ControllerAreaNetwork,是一种重要的车用网络通信协议。它由德国公司博世(Bosch)设计,首次在1986年公布,并在1991年正式发布为标准。CAN协议被设计用于允许车辆上的微控制器和设备之间无主机的通信。CAN协议的主要用途包括:车辆内部通信:CAN协议最初就是为了汽......
  • crypto.randomUUID()
    crypto.randomUUID()是一个函数,用于生成一个随机的通用唯一标识符(UniversallyUniqueIdentifier,UUID)版本4。这个函数常在编程中用于创建唯一的字符串标识,适用于各种需要唯一性的场景,如数据库记录、会话管理、临时文件命名等。在不同的编程语言和环境中,其实现细节可能有所不同......
  • [SCOI2007] 蜥蜴 题解
    发现实际上就是在求有多少只蜥蜴能逃出来。发现可以将柱子拆成入点和出点两部分,自己的出点向别人的入点连边,自己的入点向自己的出点连边。最后再加一个超级源点\(S\),连接所有有蜥蜴的柱子入点;再加一个超级汇点\(T\),连接所有能够跳出地图的柱子。我们猛然发现:这个问题不就是求......
  • 题解:AT_abc352_C [ABC352C] Standing On The Shoulders
    考场憋了很久,最后代码贼短……理想状态下,直接全排列解决问题。但是,\(1\len\le2\times10^5\),明显TLE,试都不用试的。咋优化呢?其实,前面的巨人只负责“打地基”,作为“塔尖儿”的巨人有且仅有1个。而前面地基随便排列,地基高度(他们的和)都不会变。所以,我们只需要枚举塔尖即......