Android 获取数据库表中的数据如果不存在请插入,否则返回行id
我有一个表文件,其中包含一个列date_file_creation,我想创建一个表日期包含日期文件创建,当我插入一个新文件时,我检查表日期是否存在,我返回行id并将其作为外键插入表文件,否则我插入一个新日期并获取其新行id以将其插入表文件。我该怎么做 这是我的尝试:首先,我创建一个函数findfile来检查日期是否存在Android 获取数据库表中的数据如果不存在请插入,否则返回行id,android,sql,sqlite,Android,Sql,Sqlite,我有一个表文件,其中包含一个列date_file_creation,我想创建一个表日期包含日期文件创建,当我插入一个新文件时,我检查表日期是否存在,我返回行id并将其作为外键插入表文件,否则我插入一个新日期并获取其新行id以将其插入表文件。我该怎么做 这是我的尝试:首先,我创建一个函数findfile来检查日期是否存在 public int finddate(String date){ AndroidOpenDbHelper androidOpenDbHelperObj = new An
public int finddate(String date){
AndroidOpenDbHelper androidOpenDbHelperObj = new AndroidOpenDbHelper(this);
SQLiteDatabase sqliteDatabase = androidOpenDbHelperObj.getWritableDatabase();
Cursor cursor = sqliteDatabase.rawQuery("SELECT _id FROM " + AndroidOpenDbHelper.TABLE_DATE + " where COLUMN_NAME_DATE = date", null);
startManagingCursor(cursor);
if (cursor != null ) {
if (cursor.moveToFirst()) {
do {
int id = cursor.getInt(cursor.getColumnIndex("_id"));
return id;
} while (cursor.moveToNext());
}
}
return 0;
}
然后在onCreate
上执行该操作
if( resultat==0)
{
Filedate date1=new Filedate();
date1.setfileDate(providedFileDate);
filedateArrayList.add(date1);
insertDate(date1);//insert in table date
newid=finddate(providedFileDate);//get the row id of the new date inserting
}
else
{newid=resultat; //the row id =the result reterned by the finfdate method}
然后我将其插入文件表中
这是myDbhelper
public class AndroidOpenDbHelper extends SQLiteOpenHelper {
// Database attributes
public static final String DB_NAME = "file_db";
public static final int DB_VERSION = 1;
// file Table attributes
public static final String TABLE_FILE = "file_table";
public static final String COLUMN_NAME_FILE_NAME = "file_name_column";
public static final String COLUMN_NAME_FILE_CATEGORY = "file_category_column";
public static final String COLLUMN_NAME_FILE_THEME= "file_theme_column";
public static final String COLLUMN_NAME_FILE_DATE_CREATING = "file_date_creating_column";
public static final String COLLUMN_NAME_FILE_CLOUD = "file_cloud_column";
public static final String COLLUMN_NAME_FILE_DATE_UPLOADING = "file_date_upload_column";
//category table
public static final String TABLE_CATEGORY = "category_table";
public static final String COLUMN_NAME_CATEGORY = "category_column";
public static final String COLLUMN_NAME_CATEGORY_ABREVIATION = "abreviation_column";
//theme table
public static final String TABLE_THEME = "theme_table";
public static final String COLUMN_NAME_THEME = "theme_column";
public static final String COLLUMN_NAME_THEME_ABREVIATION = "abreviation_column";
//date table
public static final String TABLE_DATE = "date_table";
public static final String COLUMN_NAME_DATE = "date_column";
public AndroidOpenDbHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// create category table
String sqlQueryToCreateCategoryTable = "create table if not exists " + TABLE_CATEGORY + " ( " + BaseColumns._ID + " integer primary key autoincrement, "
+ COLUMN_NAME_CATEGORY + " text not null, "
+ COLLUMN_NAME_CATEGORY_ABREVIATION + " text not null);";
db.execSQL(sqlQueryToCreateCategoryTable);
//create theme table
String sqlQueryToCreateThemeTable = "create table if not exists " + TABLE_THEME + " ( " + BaseColumns._ID + " integer primary key autoincrement, "
+ COLUMN_NAME_THEME + " text not null, "
+ COLLUMN_NAME_THEME_ABREVIATION + " text not null);";
db.execSQL(sqlQueryToCreateThemeTable);
//table date creation
String sqlQueryToCreateDateTable = "create table if not exists " + TABLE_DATE + " ( " + BaseColumns._ID + " integer primary key autoincrement, "
+ COLUMN_NAME_DATE + " text not null);";
db.execSQL(sqlQueryToCreateDateTable);
//Because this method get executed every time we created an object of this class.
//"create table if not exists TABLE_NAME ( BaseColumns._ID integer primary key autoincrement, FIRST_COLUMN_NAME text not null, SECOND_COLUMN_NAME integer not null);"
String sqlQueryToCreateFileTable = "create table if not exists " + TABLE_FILE + " ( " + BaseColumns._ID + " integer primary key autoincrement, "
+ COLUMN_NAME_FILE_NAME + " text not null, "
+ " FOREIGN KEY ("+COLUMN_NAME_FILE_CATEGORY+") REFERENCES "+TABLE_CATEGORY+" ("+BaseColumns._ID+"), "
+ " FOREIGN KEY ("+COLLUMN_NAME_FILE_THEME+") REFERENCES "+TABLE_THEME+" ("+BaseColumns._ID+"), "
+ " FOREIGN KEY ("+COLLUMN_NAME_FILE_DATE_CREATING +") REFERENCES "+TABLE_DATE+" ("+BaseColumns._ID+"), "
+ COLLUMN_NAME_FILE_CLOUD + " text default null,"
+ COLLUMN_NAME_FILE_DATE_UPLOADING + " text default null);";
db.execSQL(sqlQueryToCreateFileTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(oldVersion == 1 && newVersion == 2){
// Upgrade the database
}
}
}如果对数据库进行了更改,则该表可能还不存在。我的数据库也有同样的问题。当它具有相同的名称和版本时,即使通过添加表进行更改,也不会创建数据库的新工作版本 您必须更改版本号并使用更新数据库功能,或者清除当前数据库,以便获得新的工作版本 检查数据库当前是否创建了数据表。您可以通过在命令行中运行“adbshell”来实现这一点。正在查找数据库并运行sqlite3[数据库名称]。进入后,您可以通过键入“.table”来找出有哪些表。如果数据_表未显示,则表示尚未在数据库中创建该表
我又看了你的代码。我认为您的文件\u数据表构建不正确。我对您用来退出它的SQL语句做了一些更改,最终能够构建数据库。看看这是否有帮助
String sqlQueryToCreateFileTable = "create table if not exists " + TABLE_FILE + " ( " + BaseColumns._ID + " integer primary key autoincrement, "
+ COLUMN_NAME_FILE_NAME + " text not null, " + COLLUMN_NAME_FILE_THEME + " text not null, " + COLLUMN_NAME_FILE_DATE_CREATING + " text not null, "+ COLUMN_NAME_FILE_CATEGORY + " text not null, "
+ COLLUMN_NAME_FILE_CLOUD + " text not null, "+ COLLUMN_NAME_FILE_DATE_UPLOADING + " text default null, FOREIGN KEY (" + COLUMN_NAME_FILE_CATEGORY+") REFERENCES "+TABLE_CATEGORY+" ("+BaseColumns._ID+"), "
+ " FOREIGN KEY ("+COLLUMN_NAME_FILE_THEME+") REFERENCES "+TABLE_THEME+" ("+BaseColumns._ID+"), "
+ " FOREIGN KEY ("+COLLUMN_NAME_FILE_DATE_CREATING +") REFERENCES "+TABLE_DATE+" ("+BaseColumns._ID+"));";
把它放在你的手臂上。您可能还必须清理数据库,以确保创建新数据库。只有在没有具有相同名称和版本的数据库时,数据库onCreate()才会运行。如果存在具有相同版本和名称的数据库,则不会创建该数据库的另一个副本
我还注意到你试图用错误的方式搜索日期。你需要写这样的东西
Cursor cursor = sqliteDatabase.rawQuery("SELECT _id FROM " + AndroidOpenDbHelper.TABLE_DATE + " where " + AndroidOpenDbHelper.COLUMN_NAME_DATE + "= '" + date + "';", null);
否则,您的查询只是在列\u NAME\u DATE中搜索字符串DATE的实例,并尝试将其与日期文件表中的列进行比较。您当前的SQL语句是“查找假设的“data”列中的值等于“column\u NAME\u DATE”中的值的行”
添加到SQL语句中的变量需要添加到引号中。
“从“+表名+”中选择*,其中“+列名+”='“+值名+”;”
希望这能有所帮助。您是否在寻求更好的方法?因为您已经实现了获取插入行的id。我不太明白你的问题。resultat在你的活动中是一个全局变量吗?因为如果它是,那么它将永远是零?我不明白为什么resultat永远不会为零,因为您在onCreate中有此代码。是的,我会更改它,因为我无法创建日期表,所以我的代码不会有任何结果,我在logcat//06-15 05:18:55.947:E/AndroidRuntime(354):致命异常:main 06-15 05:18:55.947:E/AndroidRuntime(354)上有此错误:android.database.sqlite.SQLiteException:没有这样的表:date\u table:,编译时:选择_idfrom date\u table,其中COLUMN\u NAME\u date=date//我的表日期和表文件在开始时为空您需要发布dbhelper类,很明显,这里出现了一些问题,它没有创建您认为是的表。我的代码中是否存在错误或缺失?因为表和列都存在,但我仍然有这个06-15 05:56:18.547:E/AndroidRuntime(7541):android.database.sqlite.SQLiteException:没有这样的列:column\u NAME\u DATE:,编译时:从创建列\u NAME\u date=datetabe的日期\u表中选择\u id,但当我尝试向数据库中添加新表时,我得到了以下信息:sqlite返回:错误代码=1,消息=无此类表:文件\u表,如何更新数据库
String sqlQueryToCreateFileTable = "create table if not exists " + TABLE_FILE + " ( " + BaseColumns._ID + " integer primary key autoincrement, "
+ COLUMN_NAME_FILE_NAME + " text not null, " + COLLUMN_NAME_FILE_THEME + " text not null, " + COLLUMN_NAME_FILE_DATE_CREATING + " text not null, "+ COLUMN_NAME_FILE_CATEGORY + " text not null, "
+ COLLUMN_NAME_FILE_CLOUD + " text not null, "+ COLLUMN_NAME_FILE_DATE_UPLOADING + " text default null, FOREIGN KEY (" + COLUMN_NAME_FILE_CATEGORY+") REFERENCES "+TABLE_CATEGORY+" ("+BaseColumns._ID+"), "
+ " FOREIGN KEY ("+COLLUMN_NAME_FILE_THEME+") REFERENCES "+TABLE_THEME+" ("+BaseColumns._ID+"), "
+ " FOREIGN KEY ("+COLLUMN_NAME_FILE_DATE_CREATING +") REFERENCES "+TABLE_DATE+" ("+BaseColumns._ID+"));";