1

他の 3 つの整数フィールドを組み合わせて SQLite データベースの整数フィールドを更新しようとしていますが、フィールド値の長さが 1 の場合は、他の 2 つのフィールドの前にゼロを付ける必要があります。

これは、DBAdapter クラスの Upgrade Database メソッドを介して実行しようとしているルーチンです。

したがって、この現在の更新を変更する必要があります:

if (newVersion==2) {
  populatesql = "update " + DB_TABLE + 
                " set field1="+ COL_FIELD2 +
                " || " +
                COL_FIELD3 + 
                " || " + 
                COL_FIELD4;
}

このようなものに(はい、整数ではなく文字列が必要なため、プレフィックスゼロが機能しないことはわかっていますが、文字列で試して静的にしましたが、機能しませんでした)

if (newVersion==2) {
  populatesql = "update " + DB_TABLE + 
                " set field1="+ COL_FIELD2 +
                " || " +
                prefixzero(COL_FIELD3) + 
                " || " + 
                prefixzero(COL_FIELD4);
}

public String prefixzero(String number) {
    String result = Integer.toString(number);

    // Log.d("PREFIX", "result starts with this = "+result);
    if (result.length() >1 ) {
      // Log.d("PREFIX", "NO ZEROES HERE");
      return Integer.toString(number);
    }

   String zeroprefix = "";
   zeroprefix = "0"+result;
   // Log.d("PREFIX", zeroprefix);

   return zeroprefix ;
}

データベース フィールドは次のように宣言されます。

public static final String COL_FIELD4 = "day";
public static final String COL_FIELD3 = "month";
public static final String COL_FIELD2 = "year";
public static final String COL_FIELD1 = "long_date";

これは、スペースを省略したときに発生するエラーです。スペースなしで、フィールド名が単に結合されていると考えられています。使用されたコードは、このエラーの下にあります。

02-28 07:34:00.919: E/AndroidRuntime(18332): java.lang.RuntimeException: Unable to start activity ComponentInfo{co.uk.common.myapp/co.uk.common.myapp.MainActivity}: android.database.sqlite.SQLiteException: no such column: yearmonthday: update Log set long_date= yearmonthday
02-28 07:34:00.919: E/AndroidRuntime(18332):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1658)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1674)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:942)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at android.os.Looper.loop(Looper.java:130)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at android.app.ActivityThread.main(ActivityThread.java:3735)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at java.lang.reflect.Method.invokeNative(Native Method)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at java.lang.reflect.Method.invoke(Method.java:507)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:662)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at dalvik.system.NativeStart.main(Native Method)
02-28 07:34:00.919: E/AndroidRuntime(18332): Caused by: android.database.sqlite.SQLiteException: no such column: yearmonthday: update Log set long_date= yearmonthday
02-28 07:34:00.919: E/AndroidRuntime(18332):    at android.database.sqlite.SQLiteDatabase.native_execSQL(Native Method)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1763)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at co.uk.shieldstothemax.blastedneighbours.DBAdapter$DBHelper.onUpgrade(DBAdapter.java:68)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:132)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at co.uk.shieldstothemax.blastedneighbours.DBAdapter.open(DBAdapter.java:87)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at co.uk.shieldstothemax.blastedneighbours.MainActivity.onCreate(MainActivity.java:123)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-28 07:34:00.919: E/AndroidRuntime(18332):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622)

onUpgrade メソッドの Cod:

if (newVersion==2) {

                 populatesql = "update "+ DB_TABLE +" set long_date= "+getDateStr(COL_FIELD2,COL_FIELD3,COL_FIELD4);                
                }

getDateStr:

public static String getDateStr(String year, String month,String day) {
        return year+ prefixfieldzero(month)+ prefixfieldzero(day);
     }

prefixfieldzero :

public static String prefixfieldzero(String number) {
            String result = String.valueOf(number);
          //  Log.d("PREFIX", "result starts with this = "+result);
            if (result.length() >1 ) {
             // Log.d("PREFIX", "NO ZEROES HERE");
             return number;
             }

           String zerofieldprefix = "";
           zerofieldprefix = "0"+result;
          // Log.d("PREFIX", zeroprefix);

              return zerofieldprefix ;
        }

ここに私の DBAdapter があります:

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;


public class DBAdapter {
    private static final String DB_NAME = "TABLE";
    private static final String DB_TABLE = "Log";
    private static final int DB_VERSION = 2;

    private static final String DB_CREATE = "CREATE TABLE IF NOT EXISTS "+DB_TABLE+ 
                " (_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
                       "type_id INTEGER, " +" hour INTEGER, " + 
                         "min INTEGER , " +" info VARCHAR,"+"image_desc VARCHAR, "+ 
                       "day INTEGER, "+"month INTEGER,  "+ "year INTEGER,"+" second INTEGER,long_date INTEGER ,date_time_long INTEGER NOT NULL "+");" ;


        public static final String COL_TYPE = "type_id";
        public static final String COL_HOUR = "hour";
        public static final String COL_MIN = "min";
        public static final String COL_SEC = "second";
        public static final String COL_IMAGE = "image_desc";

        public static final String COL_DAY = "day";
        public static final String COL_MON = "month";
        public static final String COL_YEAR = "year";
        public static final String COL_DATE = "date";
        public static final String COL_LONG_DATE = "long_date";
        public static final String COL_INFO = "info";   
        public static final String COL_ID = "_id";

        private SQLiteDatabase mDB;
        private DBHelper mDBHelper;
        private Context mCtx;

        private static class DBHelper extends SQLiteOpenHelper{
            public DBHelper(Context context) {
                super(context, DB_NAME, null, DB_VERSION);
            }

            @Override
            public void onCreate(SQLiteDatabase db) {
                db.execSQL(DB_CREATE);

            }

            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                Log.v("OLDDBVERSION", "Old version="+String.valueOf(oldVersion));
                Log.v("NEWDBVERSION", "New version="+String.valueOf(newVersion));
                //String upgradesql = null;
                String populatesql = null;
                if (newVersion==2) {

                 populatesql = "update "+ DB_TABLE +" set long_date= "+getDateStr(COL_YEAR,COL_MON,COL_DAY);                
                }
                if (populatesql !=null) {
                    //db.execSQL(upgradesql);               
                    if (populatesql !=null) {

                        db.execSQL(populatesql);
                    }
                }



        } 
   }

        public DBAdapter(Context ctx)
        {
            this.mCtx = ctx;
        }

        //OPEN METHOD AND CLOSE METHOD
        public DBAdapter open()
        {
            mDBHelper = new DBHelper(mCtx);
            mDB = mDBHelper.getWritableDatabase(); //important
            return this;
        }

        public void close()
        {
            mDBHelper.close();
        }

        //INSERT AND DELETE
        public long createLog(String info,String image, Integer type,Integer hour,Integer mins,Integer sec,Integer day,Integer month,Integer year,Long longdate,Long date)
        {
            ContentValues v = new ContentValues();
            v.put(COL_TYPE, type);
            v.put(COL_INFO, info);
            v.put(COL_IMAGE, image);
            v.put(COL_HOUR, hour);
            v.put(COL_SEC, sec);
            v.put(COL_MIN, mins);
            v.put(COL_DAY, day);
            v.put(COL_MON, month);
            v.put(COL_YEAR, year);
            v.put(COL_DATE, date);
            v.put(COL_LONG_DATE, longdate);

            return mDB.insert(DB_TABLE, null, v);
        }

        public boolean deleteLogRec(long id)
        {
            return mDB.delete(DB_TABLE, COL_ID + "="+ id, null)>0;
        }

        public boolean deleteAllLogs()
        {
            return mDB.delete(DB_TABLE, null, null)>0;
        }

        //get all bookmark
        public Cursor GetAllLogs(Integer i,String sortfield)
        {
            String sorted = "";
            if (i == 1 ) {
                sorted = "DESC";
            } else if (i == 2) {
                sorted = "ASC";
            } 


            return mDB.query(DB_TABLE, new String[] {COL_ID, COL_TYPE,COL_IMAGE, COL_INFO,COL_IMAGE,COL_HOUR,COL_SEC,COL_MIN,COL_DAY,COL_MON,COL_YEAR,COL_SORT_DATE},
                            null, null, null, null, COL_DATE+" "+sorted);
        }

        public Cursor allrecords() {

            return mDB.query(DB_TABLE, new String[] {COL_ID, COL_TYPE,COL_IMAGE, COL_INFO,COL_IMAGE,COL_HOUR,COL_SEC,COL_MIN,COL_DAY,COL_MON,COL_YEAR,COL_SORT_DATE},
                    null, null, null, null, null);
        }





        //get a specific log by id
        public Cursor getLog(long id)
        {
            Cursor mCursor = mDB.query(true, DB_TABLE, new String[] {COL_ID, COL_TYPE,COL_IMAGE, COL_INFO,COL_IMAGE,COL_HOUR,COL_SEC,COL_MIN,COL_DAY,COL_MON,COL_YEAR},
                    COL_ID + "=" + id,
                    null, null, null, null, null);

            if (mCursor!=null)
                mCursor.moveToFirst();
            return mCursor;
        }

        //finally update the log
        public boolean updateLog(long id, String uinfo, String uimage,Integer utype,Integer uhour,Integer usec,Integer umin,Integer uday,Integer umonth,Integer uyear,Long ulongdate,Long udate)
        {
            ContentValues v = new ContentValues();
            v.put(COL_TYPE, utype);
            v.put(COL_INFO, uinfo);
            v.put(COL_IMAGE, uimage);
            v.put(COL_HOUR, uhour);
            v.put(COL_SEC, usec);
            v.put(COL_MIN, umin);
            v.put(COL_DAY, uday);
            v.put(COL_MON, umonth);
            v.put(COL_YEAR, uyear);
            v.put(COL_DATE, udate);
            v.put(COL_SORT_DATE, ulongdate);

            return mDB.update(DB_TABLE, v, COL_ID + "=" + id, null) > 0;
        }   

        public static String prefixfieldzero(String number) {
            String result = String.valueOf(number);
          //  Log.d("PREFIX", "result starts with this = "+result);
            if (result.length() >1 ) {
             // Log.d("PREFIX", "NO ZEROES HERE");
             return number;
             }

           String zerofieldprefix = "";
           zerofieldprefix = "0"+result;
          // Log.d("PREFIX", zeroprefix);

              return zerofieldprefix ;
        }

    public static String getDateStr(String year, String month,String day) {
            return year+ prefixfieldzero(month)+ prefixfieldzero(day);
         }


}

最新の回答に従ってSQLを実行しようとしましたが、次のエラーが発生しました:

03-01 00:20:05.379: E/AndroidRuntime(19060): Caused by: android.database.sqlite.SQLiteException: near "AS": syntax error: update TABLE AS TABLE_Temp1 set long_date = (select year || substr('00' || month ,-2,2  ) || substr('00' || ,day, -2 ,2)  from Log AS TABLE_Temp2 where TABLE_Temp1.id=TABLE_Temp2.id   

長い日付を年月と日の組み合わせに更新するために使用される現在の SQL:

populatesql = "update "+DB_TABLE + " AS LogTemp1 set long_date = (select year || substr('00' || month ,-2,2  ) || substr('00' || ,day, -2 ,2)  from "+DB_TABLE+" AS LogTemp2 where LogTemp1.id=LogTemp2.id   "  ; 

私も次のように試しました:

populatesql = "update "+DB_TABLE + " AS LogTemp1 set long_date = (select year || substr('00' || month ,-2,2  ) || substr('00' || ,day, -2 ,2)  from "+DB_TABLE+" AS LogTemp2 where **LogTemp1._id=LogTemp2._id**   "  ; 
4

2 に答える 2

1

さて、私はついにあなたが望むものを手に入れました。現在の値に基づいて各行を更新する更新ステートメントが必要です。もちろん、SQLite データベースから Java コード内の関数を呼び出すことはできません。したがって、SQLite 自体の UPDATE ステートメント内ですべてを行う必要があります。

それを考えると、ステートメントは次のようになります。

UPDATE yourTable AS table1 
SET date = 
    (SELECT year || 
            substr('00' || month, -2, 2) || 
            substr('00' || day, -2, 2) 
     FROM yourTable AS table2 
     WHERE table1.id = table2.id);

ここで使用する名前を実際に使用する名前に置き換えて、有効な Java String を作成するだけです。

このsubstr('00' || month, -2, 2)ステートメントはlpad、他のデータベース エンジンのステートメント (SQLite では使用できない) と同じことを行います。

次のように読むことができます: 2 つのゼロと数値を連結し、結果の文字列の右端の 2 文字を取ります。-2手段は、右端から部分文字列のカウントを開始し、手段2は結果の部分文字列として 2 文字を取ります。

この置き換えは、 Jason Hinkleによるブログ投稿lpadに基づいています。

于 2013-02-28T20:49:33.547 に答える
0

COL_FIELD2... が文字列値であると仮定すると、次のようにしてみませんか?

     if (newVersion==2) {
       populatesql = "update " + DB_TABLE + 
                     " set field1 = " + getDateStr(COL_FIELD2, COL_FIELD3, COL_FIELD4);
     }

     getDateStr(String year, String month,String day) {
        return year + prefixzero(month) + prefixzero(day);
     }

     public String prefixzero(String number) {
        //Log.d("PREFIX", "result starts with this = "+result);
        if (number.length() > 1) {
           //Log.d("PREFIX", "NO ZEROES HERE");
           return number;
        }            
        number = "0" + number;
        //Log.d("PREFIX", zeroprefix);            
        return zeroprefix ;
     }

それらがint-values の場合、prefixzero()代わりに次のメソッドを使用できます (もちろん、のメソッド シグネチャも適応させgetDateStr()ます:

     public String prefixzero(int number) {
        if (number > 9) {
           return Integer.toString(number);
        }
        return "0" + number;
     }
于 2013-02-27T21:07:40.013 に答える