Вопрос по android, sqlite, sql – Извлечь данные из таблицы базы данных, вставить их, если не существует, иначе вернуть идентификатор строки

0

У меня есть файл таблицы, который содержит столбец date_file_creation, я хотел бы создать дату таблицы, содержащую создание файла даты, когда я вставляю новый файл, я проверяю дату таблицы, если она существует, я возвращаю идентификатор строки и вставляю его как иностранный введите файл таблицы, иначе я вставлю новую дату и получу новый идентификатор строки, чтобы вставить ее в файл таблицы. как я могу это сделать?

это моя попытка: сначала я создаю функцию findfile, чтобы проверить, существует ли дата или нет

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
    }       
}

}

да я бы это user1381760
Является ли resultat глобальной переменной в вашей деятельности? Ведь если это так, то всегда будет ноль? Я не понимаю, как resultat никогда не будет нулевым, так как у вас есть этот код в вашем onCreate. Sana
Вы пытаетесь попросить лучшего подхода? Потому что вы уже реализуете, чтобы получить идентификатор строки, которая была вставлена. Я не понимаю ваш вопрос четко. Sana
Вам нужно опубликовать свой класс dbhelper, очевидно, что-то там не так, и он не создает таблицы, как вы думаете. Barak
да, я его поменяю, у меня не может быть никакого результата моего кода, потому что я не могу создать таблицу дат, у меня есть эта ошибка на logcat // 06-15 05: 18: 55.947: E / AndroidRuntime ( 354): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: главное 06-15 05: 18: 55.947: E / AndroidRuntime (354): android.database.sqlite.SQLiteException: нет такой таблицы: date_table:, при компиляции: SELECT _id FROM date_table где COLUMN_NAME_DATE = date / / моя таблица дата и файл таблицы в начале пустые user1381760

Ваш Ответ

1   ответ
0

то таблица может еще не существовать. У меня были те же проблемы с моей базой данных. Когда оно имеет то же имя и ту же версию, оно не создает новую рабочую версию базы данных, даже если вы вносите изменения путем добавления таблиц.

Вы должны либо изменить номер версии и использовать функцию обновления базы данных, либо удалить свою текущую базу данных, чтобы получить новую рабочую версию.

Проверьте, не создана ли в вашей базе данных база данных data_table. Вы можете сделать это, запустив & quot; adb shell & quot; в командной строке. Поиск вашей базы данных и запуск sqlite3 [имя базы данных]. Оказавшись там, вы можете узнать, какие там таблицы, набрав & quot; .table & quot ;. Если data_table не отображается, значит, он не был создан в базе данных.

Я сделал еще немного, глядя на ваш код. Я не думаю, что ваша таблица file_data была построена правильно. Я внес некоторые изменения в оператор 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+"));";

Поместите это в свой AndroidOpenDbHelper. Вам также может понадобиться уничтожить вашу базу данных, чтобы убедиться, что новая база данных создана. База данных onCreate () будет работать только в том случае, если нет базы данных с таким же именем и версией. Если база данных существует с той же версией и именем, она не создаст другую копию базы данных.

Также я только что заметил, что вы пытаетесь найти дату неправильным способом. вам нужно будет написать что-то вроде этого.

Cursor cursor = sqliteDatabase.rawQuery("SELECT _id FROM " + AndroidOpenDbHelper.TABLE_DATE + " where " + AndroidOpenDbHelper.COLUMN_NAME_DATE + "= '" + date + "';", null);

В противном случае ваш запрос просто ищет в COLUMN_NAME_DATE экземпляр строковой даты и пытается сравнить его со столбцом в таблице date_file. Ваш текущий оператор SQL говорит, что найдите строки, в которых значение в гипотетическом & quot; data & quot; значение столбца равно значению в столбце & quot; COLUMN_NAME_DATE & quot ;.

Переменные, которые добавляются в оператор SQL, должны быть добавлены в кавычки. "SELECT * FROM " + TABLE_NAME + " WHERE " + COLUMN_NAME + " = '" + VALUE_NAME + "';"

Надеюсь это поможет.

tabe создан, но когда я пытаюсь добавить новую таблицу в свою базу данных, у меня есть это: sqlite вернул: error code = 1, msg = нет такой таблицы: file_table, как я могу обновить свою базу данных user1381760

Похожие вопросы