2016-11-28 124 views
-1

如何在SQLite中存储时间?如何仅在SQLite中存储时间?

我已经使用时间作为static final的值。我被困在插入和检索SQLite的时间。

我提到的谷歌某些网站:

SQLite没有存储类存储日期 和/或时间预留。取而代之的是,内置的SQLite 的日期和时间函数能够存储日期和时间为TEXT,REAL或INTEGER 值:

TEXT为ISO8601字符串(“YYYY-MM-DD HH:MM:SS .SSS“)。 REAL Julian 天数,自格林威治中午11月中午以来的天数 24,4714 B.C.根据预测的公历。 INTEGER 作为Unix时间,自1970-01-01 00:00:00 UTC以来的秒数。 应用程序可以选择以这些 格式中的任意一种格式存储日期和时间,并使用内置日期和 时间函数在格式间自由转换。

但我很困惑。
我得到这个错误。

造成的:android.database.sqlite.SQLiteException:近 “从”:语法错误(代码1):在编译:CREATE TABLE IF NOT EXISTS proname(图像标识INTEGER,标题文本,从整型,整数);在android.database.sqlite.SQLiteConnection.nativePrepareStatem ENT(本机方法)

public static final String[] titles = new String[]{"Akilam 360","Ipadikku Idhayam", 
     "Palsuvai Thoranam"}; 

public static final String[] fromtime = new String[]{"05:00:00","07:00:00","09:00:00"}; 

public static final String[] totime = new String[]{"07:00:00","09:00:00","11:00:00"}; 


public static final Integer[] images = {R.drawable.akilam_360, 
     R.drawable.ipadikku_idhayam, R.drawable.palsuvai_thoranam}; 

ListView listView; 
List<Program> rowItems; 
int iImageId; 
String sTitle,sFrom,sTo ; 
SQLiteDatabase db; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.dbcon); 

    Calendar c = Calendar.getInstance(); 

    int seconds = c.get(Calendar.SECOND); 
    int minutes = c.get(Calendar.MINUTE); 
    int hour = c.get(Calendar.HOUR_OF_DAY); 
    String time = hour+":"+minutes+":"+seconds; 

    timer = (TextView) findViewById(R.id.timer); 
    timer.setText(time); 


    db =openOrCreateDatabase("MukilProgram", Context.MODE_PRIVATE,null); 
    db.execSQL("CREATE TABLE IF NOT EXISTS proname(ImageID INTEGER,Title TEXT,From TEXT);"); 

    rowItems = new ArrayList<Program>(); 
    for (int i = 0; i < titles.length; i++) { 
     Program item = new Program(images[i], titles[i],fromtime[i],totime[i]); 
     rowItems.add(item); 
    } 


    db.execSQL("DELETE FROM proname;"); 

    listView = (ListView) findViewById(listview); 
    final ProgramAdapter adapter = new ProgramAdapter(this,rowItems, false); 
    listView.setAdapter (adapter); 


    for (int i = 0; i < adapter.getCount(); i++) { 
     Program rowItem = (Program) adapter.getItem(i); 

      iImageId = rowItem.getImageId(); 
      sTitle = rowItem.getTitle(); 
      sFrom = rowItem.getFromtime(); 
      sTo = rowItem.getTotime(); 


      //sQuantity = rowItem.getQuantity(); 
      db.execSQL("INSERT INTO proname VALUES("+ iImageId + ",'" + sTitle + "','"+sFrom+"','"+sTo+"');"); 
      Toast.makeText(Databaseconnection.this, "Added to the Table..", Toast.LENGTH_SHORT).show(); 

    } 
+0

强烈推荐 - 使用'SQLiteOpenHelper'子类。不要将所有的SQLite逻辑填入活动 –

+0

此外,这段代码是否工作或错误?因为您只在表格中声明了三列,但您已经插入了四个值。 –

+0

代码工作正常 – Udhaya

回答

0

首先,FROM是SQLite中的保留字。不要将其用作列名称。

例如,如果您只关心“从早上5点到早上7点”,那么将两个INTEGER字段存储为“从开始日起的秒数”。或分钟/小时,具体取决于您拥有的数据的粒度。

如果你需要更复杂的东西(比如你的时间在午夜重叠,而from是一天,但to是第二天),那么显然你必须以不同的方式存储数据。

但是要实现这是你的,但

final String TABLE_NAME = "proname"; 
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" 
+ "ImageID INTEGER, " 
+ "Title TEXT, " 
+ "FromTime INTEGER, " 
+ "ToTime INTEGER" // I think you missed this field 
+ ");"); 

至于其余的代码开始 - 我真的不明白加载适配器,然后装入数据库。您可以加载数据库,并对ListView使用CursorAdapter

伴随着这一点,"have you tried the insert() method instead of execSQL?"

+0

Thanq的'FROM'保留关键字,但它显示我同样的错误 – Udhaya

+0

引起:android.database.sqlite.SQLiteException:附近“从”:语法错误(代码1):编译时:CREATE TABLE IF NOT EXISTS proname(ImageID INTEGER,Title TEXT,From INTEGER,To INTEGER); at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) – Udhaya

+1

FROM是一个保留的关键字 – Nas