2015-12-07 84 views
-2

大家好我建立一個android應用程序有timepicker。我想要的是,當用戶單擊保存按鈕兩次時,我想更新數據庫。請指導我如何做到這一點。現在我的應用程序崩潰了,因爲沒有更新數據庫。有人可以幫我解決數據庫問題嗎?

TimeTable.java

public class Monday extends FragmentActivity implements TimePickerFragment.TimePickerDialogListener { 
    EditText et1, et2, et3; 
    TextView tvm; 
    LinearLayout llm; 
    int fhour, fmin, thour, tmin, j; 
    private int cnt = 0; 
    View vi[] = new View[100]; 
    TimeTableDbHelper db; 
    String txt,fmeridien,tmeridien,ftime,ttime; 
    private static final int START_TIME_PICKER_ID = 1; 
    private static final int END_TIME_PICKER_ID = 2; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Intent intent = getIntent(); 
     setContentView(R.layout.activity_monday); 
     tvm = (TextView) findViewById(R.id.tvm); 
     llm = (LinearLayout) findViewById(R.id.llm); 
     db = new TimeTableDbHelper(this); 

     cnt = db.check("timetableM"); 
     if (cnt > 0) { 
      int i; 
      for (i = 0; i < cnt; i++) { 
       LinearLayout mn = (LinearLayout) findViewById(R.id.llm); 
       View view = getLayoutInflater().inflate(R.layout.activity_timepicker, mn, false); 
       vi[i] = view; 
       mn.addView(view); 
       et1 = (EditText) vi[i].findViewById(R.id.txtTime); 
       et1.setText(db.rd1(i,1)); 
       //Log.i("Monday", "Database read" + db.read(2) + db.read(3)); 
       et2 = (EditText) vi[i].findViewById(R.id.txtTime2); 
       et2.setText(db.rd1(i,2)); 
       //Log.i("Monday", "Database read" + db.read(4) + db.read(5)); 
       et3 = (EditText) vi[i].findViewById(R.id.txtSet); 
       et3.setText(db.rd1(i,3)); 
      } 
      j = i; 
     } else { 
      j = 0; 
     } 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_monday, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 

     return super.onOptionsItemSelected(item); 
    } 

    public void setTime(View v) { 
     LinearLayout main = (LinearLayout) findViewById(R.id.llm); 
     View view = getLayoutInflater().inflate(R.layout.activity_timepicker, main, false); 
     view.setTag(j); 
     main.addView(view); 
     vi[j] = view; 
    } 

    public void setTime2(View v) { 
     DialogFragment newFragment = TimePickerFragment.newInstance(START_TIME_PICKER_ID); 
     newFragment.show(getFragmentManager(), "timePicker"); 
    } 

    public void setTime3(View v) { 
     DialogFragment newFragment = TimePickerFragment.newInstance(END_TIME_PICKER_ID); 
     newFragment.show(getFragmentManager(), "timePicker"); 
    } 

    @Override 
    public void onTimeSet(int id, TimePicker view, int hourOfDay, int minute) { 
     Log.i("TimePicker", "Time picker set from id " + id + "!"); 
     if (id == START_TIME_PICKER_ID) { 
      et1 = (EditText) vi[j].findViewById(R.id.txtTime); 

      fmin = minute; 
      if(hourOfDay <= 12) { 
       fhour = hourOfDay; 
       fmeridien = "AM"; 
      } else { 
       fhour = hourOfDay-12; 
       fmeridien = "PM"; 
      } 
       ftime =fhour + ":" + fmin + fmeridien; 

      et1.setText(ftime); 
     } else { 
      et2 = (EditText) vi[j].findViewById(R.id.txtTime2); 
      tmin = minute; 
      if(hourOfDay < 12) { 
       thour = hourOfDay; 
       tmeridien = "AM"; 
      } else { 
       thour = hourOfDay-12; 
       tmeridien = "PM"; 
      } 
      ttime = thour + ":" + tmin +tmeridien; 
      et2.setText(ttime); 
     } 
    } 
    public void Save(View v) 
    { 
     int position = (int) v.getTag(); 
     if(position<j); 
     else { 
      et3 = (EditText) vi[j].findViewById(R.id.txtSet); 
      txt = et3.getText().toString(); 
      Log.i("Position", "Value is " + position); 

      db.write1(j, ftime, ttime, txt); 
      Toast.makeText(this, "Successfully saved", Toast.LENGTH_LONG).show(); 

     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     Calendar c = Calendar.getInstance(); 
     c.setFirstDayOfWeek(Calendar.MONDAY); 
     int day = c.get(Calendar.DAY_OF_WEEK); 
     int value; 
     if(fmeridien=="AM") value=0; 
     else value=1; 
     c.set(Calendar.DAY_OF_WEEK,day); 
     c.set(Calendar.AM_PM, value); 
     c.set(Calendar.HOUR, fhour); 
     c.set(Calendar.MINUTE, fmin); 
     c.set(Calendar.SECOND,0); 
     Intent i = new Intent("com.example.annu.sheduler.DisplayNotification"); 
     //---assign an ID of 1--- 
     i.putExtra("NotifID", j); 
     i.putExtra("text",txt); 
     PendingIntent displayIntent = PendingIntent.getActivity(
       getBaseContext(), j, i, 0); 
     j++; 
     //---sets the alarm to trigger--- 
     alarmManager.set(AlarmManager.RTC_WAKEUP, 
       c.getTimeInMillis(), displayIntent);} 
    } 
} 

activity_monday.xml

<LinearLayout android:id="@+id/llm" 
       xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:tools="http://schemas.android.com/tools" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical" 
       tools:context="com.example.annu.sheduler.Monday" 
       android:background="#ffffa751" 
       android:label="Monday"> 

    <TextView 
     android:id="@+id/tvm" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="setTime" 
     android:paddingLeft="16dp" 
     android:paddingRight="16dp" 
     android:paddingTop="16dp" 
     android:text="Create a schedule" 
     android:textStyle="bold" 
     android:textSize="24sp"/> 
</LinearLayout> 

activity_timepicker.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:weightSum="1"> 

    <EditText 
     android:id="@+id/txtTime" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight=".30" 
     android:hint="From" 
     android:onClick="setTime2"/> 

    <EditText 
     android:id="@+id/txtTime2" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight=".30" 
     android:hint="To" 
     android:onClick="setTime3"/> 

    <EditText 
     android:id="@+id/txtSet" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight=".40" 
     android:hint="Description!!!"/> 
    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Save" 
     android:onClick="Save" 
     android:minHeight="0dp" 
     android:minWidth="20dp"/> 
</LinearLayout> 

TimeTableDbHelper.java

public class TimeTableDbHelper extends SQLiteOpenHelper { 
    public static final String TABLE_NAMEM = "timetableM"; 
    public static final String COLUMN_NO1 = "c_no1"; 
    public static final String COLUMN_FROM_TIME1 = "FTIME1"; 
    public static final String COLUMN_TO_TIME1 = "TTIME1"; 
    public static final String COLUMN_DESC1 = "Description1"; 
    private static final int DATABASE_VERSION = 1; 
    static final String DATABASE_NAME = "TimeTable.db"; 
    public TimeTableDbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
    @Override 
    public void onCreate(SQLiteDatabase sqLiteDatabase) { 
     final String SQL_CREATE_TIME_TABLE1 = "CREATE TABLE " + TABLE_NAMEM + " (" + 
       COLUMN_NO1 + " INTEGER PRIMARY KEY, " + 
       COLUMN_FROM_TIME1 + " STRING NOT NULL," + 
       COLUMN_TO_TIME1 + " STRING NOT NULL," + 
       COLUMN_DESC1 + " TEXT NOT NULL" + 
       ");"; 
     sqLiteDatabase.execSQL(SQL_CREATE_TIME_TABLE1); 
    }  
    @Override 
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { 
     sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_NAMEM); 
     onCreate(sqLiteDatabase); 
    } 
    public void write1(int column_no, String ftime, String ttime, String desc) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(COLUMN_NO1, column_no); 
     values.put(COLUMN_FROM_TIME1, ftime); 
     values.put(COLUMN_TO_TIME1, ttime); 
     values.put(COLUMN_DESC1, desc); 
     Boolean res = CheckIsDataAlreadyInDBorNot(TABLE_NAMEM, COLUMN_NO1, column_no); 
     if (res == false) db.insert(TABLE_NAMEM, null, values); 
     else db.update(TABLE_NAMEM, values, null, null); 
     db.close(); 
    }  
    public int check(String tname) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     String count = "SELECT count(*) FROM " + tname; 
     Cursor mcursor = db.rawQuery(count, null); 
     mcursor.moveToFirst(); 
     int icount = mcursor.getInt(0); 
     return icount; 
    } 
    public String rd1(int c_no, int col) { 
     String selectQuery = "SELECT * FROM " + TABLE_NAMEM + " WHERE " + COLUMN_NO1 + " = " + c_no; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 
     String data = ""; 
     if (cursor.moveToFirst()) { 
      // get the data into array,or class variable 
      do { 
       data = cursor.getString(col); 
       //Log.i("TimeTableDbHelper", "Value read " + cursor.getString(6)); 
      } while (cursor.moveToNext()); 
     } 
     db.close(); 
     return data; 
    } 
    public boolean CheckIsDataAlreadyInDBorNot(String TableName, 
               String dbfield, int fieldValue) { 
     SQLiteDatabase db = this.getReadableDatabase(); 
     String Query = "Select * from " + TableName + " where " + dbfield + " = " + fieldValue; 
     Cursor cursor = db.rawQuery(Query, null); 
     if (cursor.getCount() <= 0) { 
      cursor.close(); 
      return false; 
     } 
     cursor.close(); 
     return true; 
    } 
} 
+1

'當用戶進入保存按鈕兩次「多麼可怕的用戶界面! –

+0

但是,問題在於您如何創建表格。 '聲明類型的'STRING'具有NUMERIC的親和力,而不是TEXT.',正如[官方SQLite文檔](https://www.sqlite.org/datatype3.html)中所報告的那樣 - 顯然,你沒有不在乎閱讀。 –

+0

在沒有錯誤消息或異常消息的情況下發布代碼會讓人們很難幫助您。 – sean

回答

相關問題