@Dao
public interface MyDao {
@Query("SELECT * FROM book "
-
"INNER JOIN loan ON loan.book_id = book.id "
-
"INNER JOIN user ON user.id = loan.user_id "
-
“WHERE user.name LIKE :userName”)
public List findBooksBorrowedByNameSync(String userName);
}
Room提供了Migration类来实现数据库的升级:
Room.databaseBuilder(getApplicationContext(), MyDb.class, “database-name”)
.addMigrations(MIGRATION_1_2, MIGRATION_2_3).build();
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE Fruit
(id
INTEGER, "
- “
name
TEXT, PRIMARY KEY(id
))”);
}
};
static final Migration MIGRATION_2_3 = new Migration(2, 3) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE Book "
- " ADD COLUMN pub_year INTEGER");
}
};
在创建Migration类时需要指定startVersion
和endVersion
, 代码中MIGRATION_1_2
和MIGRATION_2_3
的startVersion和endVersion是递增的, Migration其实是支持从版本1直接升到版本3,只要其migrate()
方法里执行的语句正常即可。那么Room是怎么实现数据库升级的呢?其实本质上还是调用SQLiteOpenHelper.onUpgrade
,Room中自己实现了一个SQLiteOpenHelper
, 在onUpgrade()
方法被调用时触发Migration
,当第一次访问数据库时,Room做了以下几件事:
-
创建Room Database实例
-
SQLiteOpenHelper.onUpgrade
被调用,并且触发Migration
-
打开数据库
架构组件Room、demo了解:https://download.csdn.net/download/meixi_android/19386289
原生sqlite、demo链接:https://download.csdn.net/download/meixi_android/10710400
创建数据库版本v.1
/**
-
作者:created by meixi
-
邮箱:13164716840@163.com
-
日期:2018/10/9 11
*/
public class DBHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = “mall.db”;
private static final int DATABASE_VERSION = 1000;
private static DBHelper instance = null;
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public synchronized static DBHelper getInstance(Context context) {
if (instance == null) {
instance = new DBHelper(context);
}
return instance;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL.CREATE_TABLE_FAVORITE);
// 若不是第一个版本安装,直接执行数据库升级
// 请不要修改FIRST_DATABASE_VERSION的值,其为第一个数据库版本大小
final int FIRST_DATABASE_VERSION = 1000;
onUpgrade(db, FIRST_DATABASE_VERSION, DATABASE_VERSION);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 使用for实现跨版本升级数据库
for (int i = oldVersion; i < newVersion; i++) {
switch (i) {
default:
break;
}
}
}
}
创建数据库语句:
public class SQL {
public static final String T_FAVORITE = “favorite”;
public static final String CREATE_TABLE_FAVORITE =
"CREATE TABLE IF NOT EXISTS " + T_FAVORITE + “(” +
"_id integer primary key autoincrement, " +
"title VARCHAR, " +
"url VARCHAR, " +
"createDate VARCHAR " +
“)”;
}
实现增删改查activity:
public class MainActivity extends AppCompatActivity {
private static String CREATE_TABLE =“create table number(_id integer primary key autoincrement ,phone real)”;
int ab = 0,cd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1=findViewById(R.id.baocunid);
Button button2=findViewById(R.id.duquid);
Button button3=findViewById(R.id.shanchuid);
Button button4=findViewById(R.id.xiugaiid);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ab++;
boolean nn = baocun(MainActivity.this, new String[] { “114499title”,“rullll—htt;s==”+ab,“加入的xxx” });
Log.i(“lgq”,“sbbbb—”+nn);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getBai(MainActivity.this);
}
});
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String ss= Delete(MainActivity.this,“1”);
Log.i(“lgq”,“shanchu=g===”+ss);
}
});
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String ss = updata(MainActivity.this,“”);
Log.i(“lgq”,“xiugg=g===”+ss);
}
});
}
public static boolean baocun(Context context, String[] values) {
SQLiteDatabase db2=null;
DBHelper2 dbHelper = null;
try {
dbHelper =new DBHelper2(context);
db2 = dbHelper.getWritableDatabase();
db2=dbHelper.getWritableDatabase();
db2.beginTransaction();
db2.execSQL(“insert into favorite (title,url,deleted) values (?,?,?)”,values);
db2.setTransactionSuccessful();
db2.endTransaction();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}finally{
}
}
public List getBai(Context context){
List list = new ArrayList();
SQLiteDatabase db2=null;
DBHelper2 dbHelper = null;
try {
dbHelper= new DBHelper2(context);
db2=dbHelper.getWritableDatabase();
Cursor cursor =db2.rawQuery(“select _id,title,deleted from favorite”, null);
while(cursor.moveToNext()){
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
结尾
如何才能让我们在面试中对答如流呢?
答案当然是平时在工作或者学习中多提升自身实力的啦,那如何才能正确的学习,有方向的学习呢?为此我整理了一份Android学习资料路线:
这里是一份BAT大厂面试资料专题包:
好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
的面试以及工作经验完善自己的之后的面试计划及职业规划。
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算