0

私は列date_file_creationを含むテーブルファイルウィッチを持っています。テーブル日付を作成したいのですが、新しいファイルを挿入すると、テーブルの日付が存在するかどうかを確認します行IDを返し、それを外部として挿入しますそれ以外の場合は、新しい日付を挿入し、その新しい行 ID を取得してテーブル ファイルに挿入します。これどうやってするの?

これは私の試みです。最初に関数 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}

次に、ファイルテーブルに挿入します

これは私のDbhelperです

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

}

4

1 に答える 1

0

データベースに変更を加えた場合、テーブルがまだ存在していない可能性があります。データベースにも同じ問題がありました。同じ名前と同じバージョンの場合、テーブルを追加して変更を加えても、データベースの新しい作業バージョンは作成されません。

バージョン番号を変更してデータベースの更新機能を使用するか、現在のデータベースを吹き飛ばして新しい作業バージョンを取得できるようにする必要があります。

現在、データベースに data_table が作成されているかどうかを確認してください。これを行うには、コマンド ラインで「adb shell」を実行します。データベースを見つけて、sqlite3 [データベース名] を実行しています。そこに入ったら、「.table」と入力して、そこにあるテーブルを見つけることができます。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 ステートメントは、仮想の「データ」列の値が「COLUMN_NAME_DATE」の値と等しい行を見つけると言っています。

SQL ステートメントに追加される変数は、引用符で囲む必要があります。 "SELECT * FROM " + TABLE_NAME + " WHERE " + COLUMN_NAME + " = '" + VALUE_NAME + "';"

お役に立てれば。

于 2012-06-15T13:12:47.937 に答える