Android 内部删除查询sqlite
我有一个数据库、事件表和时间表。我将事件与时间表联系起来。事件具有时间表键列。现在我想删除一个时间表,当时间表被删除时,引用到相应时间表的事件应该被删除。如何做到这一点 我当前的删除查询是只删除表而不删除事件Android 内部删除查询sqlite,android,database,android-sqlite,inner-join,sql-delete,Android,Database,Android Sqlite,Inner Join,Sql Delete,我有一个数据库、事件表和时间表。我将事件与时间表联系起来。事件具有时间表键列。现在我想删除一个时间表,当时间表被删除时,引用到相应时间表的事件应该被删除。如何做到这一点 我当前的删除查询是只删除表而不删除事件 public void deleteTable(TimeTable timeTable) { SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_TIME_TABLE, KEY_TIME_T
public void deleteTable(TimeTable timeTable) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_TIME_TABLE, KEY_TIME_TABLE_ID + " = ?",
new String[]{String.valueOf(timeTable.getId())});
db.close();
}
数据库助手
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String TABLE_TIME_TABLE = "timetables";
private static final String KEY_TABLE_TITLE = "tabletitle";
private static final String KEY_TIME_TABLE_ID = "timetableid";
private static final String KEY_TABLE_COLOR = "tablecolor";
private static final String KEY_STATUS = "status";
private static final String TABLE_EVENTS = "event";
private static final String KEY_ID = "id";
private static final String KEY_TITLE = "title";
private static final String KEY_START_HOURS = "starthours";
private static final String KEY_START_MINS = "startmins";
private static final String KEY_END_HOURS = "endhours";
private static final String KEY_END_MINS = "endmins";
private static final String KEY_FROM_DATE = "datefrom";
private static final String KEY_TO_DATE = "dateto";
private static final String KEY_LOCATION = "location";
private static final String KEY_DAY_OF_WEEK = "dayofweek";
private static final String KEY_NOTIFICATION_TIME = "notification";
private static final String KEY_COLOR = "color";
private Context context;
public DatabaseHelper(Context context) {
super(context, Constants.DATABASE_NAME, null, Constants.DATABASE_VERSION);
//3rd argument to be passed is CursorFactory instance
this.context = context;
}
// Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {
createTable(db);
}
public void createDatabase(){
context.deleteDatabase(Constants.DATABASE_NAME + ".db");
SQLiteDatabase db = this.getReadableDatabase();
}
public void createTable(SQLiteDatabase db){
String CREATE_EVENTS_TABLE = "CREATE TABLE " + TABLE_EVENTS + "("
+ KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ KEY_TITLE + " TEXT,"
+ KEY_FROM_DATE + " DATE,"
+ KEY_TO_DATE + " DATE,"
+ KEY_DAY_OF_WEEK + " TEXT,"
+ KEY_LOCATION + " TEXT,"
+ KEY_NOTIFICATION_TIME + " DATE,"
+ KEY_TIME_TABLE_ID + " TEXT" + ")";
db.execSQL(CREATE_EVENTS_TABLE);
String CREATE_TIME_TABLE = "CREATE TABLE " + TABLE_TIME_TABLE + "("
+ KEY_TIME_TABLE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ KEY_TABLE_TITLE + " TEXT,"
+ KEY_STATUS + " TEXT,"
+ KEY_TABLE_COLOR + " TEXT" + ")";
db.execSQL(CREATE_TIME_TABLE);
}
// Upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + TABLE_EVENTS);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_TIME_TABLE);
context.deleteDatabase(Constants.DATABASE_NAME + ".db");
createTable(db);
// Create tables again
//onCreate(db);
}
}
我尝试了此内部删除查询,但它不起作用:
public void delete(TimeTable t,int id)
{
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL(" DELETE FROM " + TABLE_TIME_TABLE + " WHERE " + KEY_TIME_TABLE_ID + " == " + id + " IN "
+ " ( " + " SELECT * FROM " + TABLE + " WHERE " + KEY_TIME_TABLE_ID + " == " + id + " ) ");
db.close();
}
有人能帮忙吗
谢谢。删除与要删除的时间表条目相关的事件。诸如此类:
DELETE FROM EVENTS WHERE TIMETABLE_ID=...
删除引用您要删除的时间表条目的事件。诸如此类:
DELETE FROM EVENTS WHERE TIMETABLE_ID=...
有两种方法可以做到这一点。 第一个选项:修改
deleteTable(时间表)
函数以删除父记录和子记录。
最好先使用父id删除子记录(事件),然后使用相同的id删除父记录(时间表)
public void deleteTable(TimeTable timeTable) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_EVENTS, KEY_TIME_TABLE_ID + " = ?",//KEY_TIME_TABLE_ID is a foreign key
new String[]{String.valueOf(timeTable.getId())});
db.delete(TABLE_TIME_TABLE, KEY_TIME_TABLE_ID + " = ?",
new String[]{String.valueOf(timeTable.getId())});
db.close();
}
您可能希望将事件表中的KEY\u TIME\u TABLE\u ID
命名为FK\u TIME\u TABLE\u ID
使代码更具可读性
第二个选项:在创建表时使用delete cascade定义外键(您也可以更改现有表并添加它们)
注意:sqlite默认不支持外键,因此每次连接到数据库时都运行以下查询
PRAGMA foreign_keys = ON
这将启用外键有两种方法。 第一个选项:修改
deleteTable(时间表)
函数以删除父记录和子记录。
最好先使用父id删除子记录(事件),然后使用相同的id删除父记录(时间表)
public void deleteTable(TimeTable timeTable) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_EVENTS, KEY_TIME_TABLE_ID + " = ?",//KEY_TIME_TABLE_ID is a foreign key
new String[]{String.valueOf(timeTable.getId())});
db.delete(TABLE_TIME_TABLE, KEY_TIME_TABLE_ID + " = ?",
new String[]{String.valueOf(timeTable.getId())});
db.close();
}
您可能希望将事件表中的KEY\u TIME\u TABLE\u ID
命名为FK\u TIME\u TABLE\u ID
使代码更具可读性
第二个选项:在创建表时使用delete cascade定义外键(您也可以更改现有表并添加它们)
注意:sqlite默认不支持外键,因此每次连接到数据库时都运行以下查询
PRAGMA foreign_keys = ON
这将启用外键我尝试了以下操作:public void deleteEvents(int id){SQLiteDatabase db=this.getwriteabledatabase();db.execSQL(“从“+TABLE+”中删除*,其中“+KEY\u TIME\u TABLE\u id+”=“+id”);}不起作用。。。在*@ridcully附近获取语法错误删除*--它的DELETE FROM…,而不是DELETE*FROM。。。;另外,its=和not==。您可以使用delete方法代替execSQL():
db.delete(TABLE,KEY\u TIME\u TABLE\u ID+“=?”,new String[]{ID})
我尝试过这个方法:public void deleteEvents(int ID){SQLiteDatabase db=this.getwriteabledatabase();db.execSQL(“delete*FROM”+TABLE+“WHERE”+KEY\TIME\u TABLE\ID+”“==”+id);}不工作…在*@ridcully附近获取语法错误删除*--它从…,而不是从…;还有,它=和不==。并且可以使用DELETE方法而不是execSQL():db.DELETE(TABLE,KEY_TIME_TABLE_id+“=?”,新字符串[]{id})
preferred first option..效果很好。谢谢..@hyena preferred first option..效果很好。谢谢..@hyena