赞
踩
期末作品要求使用数据库,我自己折腾了一会,又看了很多博主发的文章,终于成功了,特此记录:使用SQLiteDatabase和SQLiteOpenHelper连接已有sqlite数据库。
因为我已经创建好了一个sqlite数据库,所以第一步得将我的数据库导入项目中
在app —> src —> main下创建assect文件夹,将自己的数据库粘贴进去,我的文件路径如下图所示:
创建MyDatabaseHelper.java文件
import android.content.Context; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class MyDatabaseHelper { //导入的sqlite数据库文件名 private final String DB_NAME = "AsianGames.db"; private Context context; //定义类的方法 public MyDatabaseHelper(Context context) { this.context = context; } // 复制和加载区域数据库中的数据 public String CopyDBFile() throws IOException { // 在第一次运行应用程序时,加载数据库到data/data/当前包的名称/database/数据库名字 //获取准确的路径,context.getPackageName()得到包名 File dir = new File("data/data/" + context.getPackageName() + "/databases"); //如果文件夹不存在,则创建指定的文件 if (!dir.exists() || !dir.isDirectory()) { dir.mkdir(); } //文件声明 File file = new File(dir, DB_NAME); //输入流 InputStream inputStream = null; //输出流 OutputStream outputStream = null; //若不存在,通过IO流的方式,将assets目录下的数据库文件,写入到项目模拟手机中,当开启模拟器时,会将数据库文件写入到模拟手机的内存中 if (!file.exists()) { try { //创建文件 file.createNewFile(); //加载文件 inputStream = context.getClass().getClassLoader().getResourceAsStream("assets/" + DB_NAME); //输出到文件 outputStream = new FileOutputStream(file); byte[] buffer = new byte[1024]; int len; //按字节写入 while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); } finally { //关闭资源 if (outputStream != null) { outputStream.flush(); outputStream.close(); } if (inputStream != null) { inputStream.close(); } } } return file.getPath(); } }
然后在需要用到数据库之前,写入以下代码,我这里写了个函数,直接调用即可:
public void openDatabase(){
MyDatabaseHelper myHelper = new MyDatabaseHelper(LoginOrRegisterActivity.this);
try {
myHelper.CopyDBFile();
} catch (IOException e) {
e.printStackTrace();
}
}
注:在这一行代码中,“LoginOrRegisterActivity.this”需要替换成你自己的activity文件名
MyDatabaseHelper myHelper = new MyDatabaseHelper(LoginOrRegisterActivity.this);
成功之后可以在右侧的Device File Explorer中的data —> data找到自己的项目,可以看到数据库已经被写入模拟器中了
创建OpenHelper.java文件
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import androidx.annotation.Nullable; public class OpenHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "AsianGames.db"; public OpenHelper(@Nullable Context context) { super(context, DATABASE_NAME, null, 1); } @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { } }
在这一步中,如果你调用数据库的代码是写在一个专门的java文件中的话(比如我就写在GetSQLite.java中),需要注意调用数据库时是在activity中还是在fragment中
// GetSQLite.java // 在activity中 public Cursor getData(FragmentActivity activity, String sql){ OpenHelper openHelper=new OpenHelper(activity); SQLiteDatabase db=openHelper.getReadableDatabase(); Cursor cursor = db.rawQuery(sql,null); return cursor; } // 在fragment中 public Cursor getData1(Context context, String sql, String[] o){ OpenHelper openHelper=new OpenHelper(context); SQLiteDatabase db=openHelper.getReadableDatabase(); Cursor cursor = db.rawQuery(sql,o); return cursor; }
重点是这两行代码:
OpenHelper openHelper=new OpenHelper(context);
SQLiteDatabase db=openHelper.getReadableDatabase();
到这里sqlite数据库的连接就已经结束了
1、增、删、改
我比较习惯自己写sql语句,所以就没有用它的增、删、改函数,我用的是:execSQL(String sql, Object[] bindArgs)
第一个参数是sql语句。
第二个参数是sql语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应,第二个参数可写可不写。
String sql = "update users set username=?,sex=? where user_account=?";
Object[] o = new Object[]{name,sex,user_account};
db.execSQL(sql,o);
2、查
execSQL不能执行查询语句,所以我们需要用到Cursor以及rawQuery
rawQuery(String sql, String[] selectionArgs)
第一个参数是sql语句。
第二个参数是sql语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应,第二个不需要的话可以写null。
String sql = "select * from users where username=? and password=?";
String[] s = new String[]{name,password};
Cursor cursor = db.rawQuery(sql,s);
if(cursor.moveToFirst() == true){
String id;
String name;
String psw;
String sex;
id = cursor.getString(0);
name = cursor.getString(1);
sex = cursor.getString(2);
psw = cursor.getString(3);
System.out.println(id+","+name+","+psw+","+sex)
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。