2013-02-27 100 views
1

我想通过组合三个其他整数字段来更新我的SQLite数据库中的整数字段,但是如果字段值的长度为零,我还需要在其他字段前加两个零是1.来自其他字段的SQLite Android更新字段

这是一个例程,我试图通过我的DBAdapter类中的升级数据库方法来做。

所以我需要改变这个当前的更新:

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

到这样的事情(是的,我知道的,因为它需要字符串不是整数prefixzero是行不通的,但我和字符串试了一下,并使其静态但它没有工作)

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方法:

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** " ; 
+1

出于好奇,什么是||应该在字符串上做? – njzk2 2013-02-27 17:35:46

+1

@ njzk2 ||用于连接SQLite中的字符串 – dymmeh 2013-02-27 17:57:30

+1

定义“没有工作”。你的代码虽然凌乱,但应该可以正常工作。 COL_FIELD3 – dymmeh 2013-02-27 18:07:00

回答

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字符串。

substr('00' || month, -2, 2)语句会执行其他数据库引擎的lpad语句(在SQLite中不可用)。

你可以这样阅读:连接两个零了一些,并承担由此产生的字符串中最右边两个字符。 -2表示从右边开始子字符串计数,而2表示采用两个字符作为结果子字符串。

This lpad replacement is based on a blogpost by Jason Hinkle

0

假设COL_FIELD 2 ...是字符串值,为什么不做这样的事情?

 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 - 值,你可以使用下面的prefixzero()方法来代替(当然适应的getDateStr()方法签名,以及:

 public String prefixzero(int number) { 
     if (number > 9) { 
      return Integer.toString(number); 
     } 
     return "0" + number; 
    } 
+0

如前所述,表示当天月份和年份的字段是整数。字段引用是字符串的名称,但数据库中的值是整数 – TimCS 2013-02-27 22:05:40

+0

如果prefixzero String Number实际上是prefixzero方法中的整数值,那么您的方法是否可以工作? – TimCS 2013-02-27 22:07:18

+0

你没有给我们代码,你正在从数据库中读取COL值。在自动装箱的情况下,int方法也应该使用整数,但只有在你从未有任何空值的情况下。在这种情况下,你必须修改getDateStr()的签名为Integer或int。 – 2013-02-27 22:13:35

相关问题