2013-03-01 1 views
1

Я построил одно приложение, которое принимает данные от пользователя. Я попытался сохранить данные в базе данных SQLite. Когда я запускаю приложение, интерфейс, похоже, работает хорошо. Но когда я нажимаю кнопку «Сохранить», приложение закрывается, вызывая ошибку «К сожалению приложение закрыто». Не знаю причину. Я проверил, создана ли база данных и что она не создана.DataBase не создан в SQLite

Это мой основной класс.

public class WaterReadingMainActivity extends Activity 
{ 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity_main); 

    final RelativeLayout mainLayout=(RelativeLayout)findViewById(R.id.mainLayout); 
    mainLayout.startAnimation(AnimationUtils.loadAnimation(this, android.R.anim.slide_out_right)); 
    final LinearLayout readingLayout=(LinearLayout)findViewById(R.id.waterReading); 
    readingLayout.startAnimation(AnimationUtils.loadAnimation(this, android.R.anim.slide_out_right)); 
    final LinearLayout pastDatePickerLayout=(LinearLayout)findViewById(R.id.PastDatePickerLayout); 
    pastDatePickerLayout.startAnimation(AnimationUtils.loadAnimation(this, android.R.anim.slide_out_right)); 
    readingLayout.setVisibility(View.GONE); 
    pastDatePickerLayout.setVisibility(View.GONE); 


    Button AddWaterReading=(Button)findViewById(R.id.AddWaterReading); //click on + button. 
    AddWaterReading.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      readingLayout.setVisibility(View.VISIBLE); 
      mainLayout.setVisibility(View.GONE); 
      TextView txtgetCurrentDate=(TextView)findViewById(R.id.currentDate); 
      final Calendar c=Calendar.getInstance(); 
      txtgetCurrentDate.setText((c.get(Calendar.MONTH)+1)+"/"+c.get(Calendar.DATE)+"/"+c.get(Calendar.YEAR)); 

     } 
    }); 

    TextView getPastDate=(TextView)findViewById(R.id.getDate); 
    getPastDate.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      readingLayout.setVisibility(View.GONE); 
      pastDatePickerLayout.setVisibility(View.VISIBLE);       
     } 
    }); 

    Button savePastDate=(Button)findViewById(R.id.savePastDate); 
    savePastDate.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      pastDatePickerLayout.setVisibility(View.GONE); 
      readingLayout.setVisibility(View.VISIBLE); 

      DatePicker getPastDatepicker=(DatePicker)findViewById(R.id.getPastDate); 
       int YY=getPastDatepicker.getYear(); 
       int MM=getPastDatepicker.getMonth(); 
       int DD=getPastDatepicker.getDayOfMonth(); 
       TextView getPastDate=(TextView)findViewById(R.id.getDate); 
       getPastDate.setText((MM+1)+"/"+DD+"/"+YY); 
     } 
    }); 


    Button saveWaterReadingToDB=(Button)findViewById(R.id.saveWaterReading); 
    saveWaterReadingToDB.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      readingLayout.setVisibility(View.GONE); 
      mainLayout.setVisibility(View.VISIBLE);  

      TextView getPastDate=(TextView)findViewById(R.id.getDate); 
      TextView txtgetCurrentDate=(TextView)findViewById(R.id.currentDate); 
      TextView txtgetWaterReading=(TextView)findViewById(R.id.water_Reading); 

      SQLiteDatabase DB; 
      SQLiteOpenHelper helper = null; 
      DB=helper.getWritableDatabase(); 

      String pastDate=getPastDate.getText().toString().trim(); 
      String currentDate=txtgetCurrentDate.getText().toString().trim(); 
      String waterReading=txtgetWaterReading.getText().toString().trim(); 


      ContentValues values=new ContentValues(); 
      values.put(CreateDB.COLUMN_NAME_READING_MODE,"Water"); 
      values.put(CreateDB.COLUMN_NAME_PASTDATETIME, pastDate); 
      values.put(CreateDB.COLUMN_NAME_CURRENTDATETIME, currentDate); 
      values.put(CreateDB.COLUMN_NAME_READINGVALUE, waterReading); 

      DB.insert(CreateDB.TABLE_NAME, null, values); 
      Toast.makeText(getApplicationContext(), "Added", Toast.LENGTH_LONG).show(); 
      DB.close(); 
      helper.close();     
     } 
    }); 

    } 
    } 

И класс CREATEDB,

public abstract class CreateDB extends SQLiteOpenHelper 
    {  
    private static final String DATABASE_NAME="WaterElectricityReading.db"; 
    public static final String TABLE_NAME="Reading"; 
    public static final String COLUMN_NAME_READING_ID="_Id"; 
    public static final String COLUMN_NAME_READING_MODE="ReadingMode"; 
    public static final String COLUMN_NAME_PASTDATETIME="PastDateTime"; 
    public static final String COLUMN_NAME_CURRENTDATETIME="CurrentDateTime"; 
    public static final String COLUMN_NAME_READINGVALUE="ReadingValue"; 
    private static final int DATABASE_VERSION = 1; 


    public CreateDB(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 

    } 

    public void onCreate(SQLiteDatabase DB){ 

     final String CREATE_TABLE="create table if not exists"+ TABLE_NAME + "("+ COLUMN_NAME_READING_ID +"integer primary key autoincrement," 
       +COLUMN_NAME_READING_MODE+"text not null,"+COLUMN_NAME_PASTDATETIME+"date not null,"+COLUMN_NAME_CURRENTDATETIME 
       +"date not null,"+COLUMN_NAME_READINGVALUE+"integer not null"+");"; 
     DB.execSQL(CREATE_TABLE);       

    }     
} 

Это мой трассировки стека,

03-01 11:47:49.912: E/Trace(3010): error opening trace file: No such file or directory (2) 
03-01 11:47:50.942: D/dalvikvm(3010): GREF has increased to 201 
03-01 11:47:50.961: D/gralloc_goldfish(3010): Emulator without GPU emulation detected. 
03-01 11:47:51.282: I/Choreographer(3010): Skipped 174 frames! The application may be doing too much work on its main thread. 
03-01 11:47:51.312: D/dalvikvm(3010): GC_CONCURRENT freed 149K, 9% free 3661K/3988K, paused 76ms+31ms, total 312ms 
03-01 11:48:07.402: I/Choreographer(3010): Skipped 40 frames! The application may be doing too much work on its main thread. 
03-01 11:48:08.782: I/Choreographer(3010): Skipped 33 frames! The application may be doing too much work on its main thread. 
03-01 11:48:08.812: I/Choreographer(3010): Skipped 34 frames! The application may be doing too much work on its main thread. 
03-01 11:48:08.902: I/Choreographer(3010): Skipped 41 frames! The application may be doing too much work on its main thread. 
03-01 11:48:08.952: I/Choreographer(3010): Skipped 34 frames! The application may be doing too much work on its main thread. 
03-01 11:48:09.102: I/Choreographer(3010): Skipped 37 frames! The application may be doing too much work on its main thread. 
03-01 11:48:09.153: I/Choreographer(3010): Skipped 38 frames! The application may be doing too much work on its main thread. 
03-01 11:48:09.192: I/Choreographer(3010): Skipped 30 frames! The application may be doing too much work on its main thread. 
03-01 11:48:09.283: I/Choreographer(3010): Skipped 32 frames! The application may be doing too much work on its main thread. 
03-01 11:48:10.482: I/Choreographer(3010): Skipped 64 frames! The application may be doing too much work on its main thread. 
03-01 11:48:11.023: I/Choreographer(3010): Skipped 85 frames! The application may be doing too much work on its main thread. 
03-01 11:48:11.142: I/Choreographer(3010): Skipped 100 frames! The application may be doing too much work on its main thread. 
03-01 11:48:11.705: I/Choreographer(3010): Skipped 65 frames! The application may be doing too much work on its main thread. 
03-01 11:48:13.252: D/AndroidRuntime(3010): Shutting down VM 
03-01 11:48:13.252: W/dalvikvm(3010): threadid=1: thread exiting with uncaught exception (group=0x2bd39930) 
03-01 11:48:13.272: E/AndroidRuntime(3010): FATAL EXCEPTION: main 
03-01 11:48:13.272: E/AndroidRuntime(3010): java.lang.NullPointerException 
03-01 11:48:13.272: E/AndroidRuntime(3010):  at com.example.mysamplewaterreadingapp.WaterReadingMainActivity$4.onClick(WaterReadingMainActivity.java:96) 
03-01 11:48:13.272: E/AndroidRuntime(3010):  at android.view.View.performClick(View.java:4202) 
03-01 11:48:13.272: E/AndroidRuntime(3010):  at android.view.View$PerformClick.run(View.java:17340) 
03-01 11:48:13.272: E/AndroidRuntime(3010):  at android.os.Handler.handleCallback(Handler.java:725) 
03-01 11:48:13.272: E/AndroidRuntime(3010):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-01 11:48:13.272: E/AndroidRuntime(3010):  at android.os.Looper.loop(Looper.java:137) 
03-01 11:48:13.272: E/AndroidRuntime(3010):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
03-01 11:48:13.272: E/AndroidRuntime(3010):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-01 11:48:13.272: E/AndroidRuntime(3010):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-01 11:48:13.272: E/AndroidRuntime(3010):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
03-01 11:48:13.272: E/AndroidRuntime(3010):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
03-01 11:48:13.272: E/AndroidRuntime(3010):  at dalvik.system.NativeStart.main(Native Method) 
03-01 11:48:17.203: I/Process(3010): Sending signal. PID: 3010 SIG: 9 

Мой activity_main.xml файл,

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/sampleLayoutExample" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <RelativeLayout 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" 
    tools:context=".MainActivity" 
    android:id="@+id/mainLayout"> 

    <TextView 
    android:id="@+id/textView2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignBottom="@+id/AddWaterReading" 
    android:layout_alignParentLeft="true" 
    android:layout_marginLeft="24dp" 
    android:text="@string/Water_Reading" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/textView2" 
    android:layout_below="@+id/AddWaterReading" 
    android:layout_marginTop="28dp" 
    android:text="@string/Electricity_Reading" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <Button 
    android:id="@+id/button3" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignBottom="@+id/textView1" 
    android:layout_alignLeft="@+id/AddWaterReading" 
    android:text="@string/Add_Electricity_Reading" /> 

    <Button 
    android:id="@+id/AddWaterReading" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_marginLeft="30dp" 
    android:layout_marginTop="40dp" 
    android:layout_toRightOf="@+id/textView1" 
    android:text="@string/Add_Water_Reading" /> 

    <Button 
    android:id="@+id/AddElectricityReading" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/textView1" 
    android:layout_marginLeft="15dp" 
    android:layout_toRightOf="@+id/AddWaterReading" 
    android:text="@string/btnWater_View" /> 

    <Button 
    android:id="@+id/button4" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignBaseline="@+id/button3" 
    android:layout_alignBottom="@+id/button3" 
    android:layout_alignLeft="@+id/AddElectricityReading" 
    android:text="@string/btnElectricity_View" /> 

</RelativeLayout> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id="@+id/waterReading"> 

    <TextView 
    android:id="@+id/getDate" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/get_Date" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <EditText 
    android:id="@+id/currentDate" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:ems="10" 
    android:inputType="date" > 

    <requestFocus /> 
</EditText> 

    <EditText 
    android:id="@+id/water_Reading" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:ems="10" 
    android:inputType="number" /> 

    <Button 
    android:id="@+id/saveWaterReading" 
    android:layout_width="206dp" 
    android:layout_height="wrap_content" 
    android:text="@string/Save_Reading" /> 

</LinearLayout> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id="@+id/PastDatePickerLayout"> 

    <DatePicker 
    android:id="@+id/getPastDate" 
    android:layout_width="374dp" 
    android:layout_height="wrap_content" 
    android:calendarViewShown="false"/> 

    <Button 
    android:id="@+id/savePastDate" 
    android:layout_width="316dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="bottom" 
    android:text="@string/Save_Date" /> 

    </LinearLayout> 
    </RelativeLayout> 

Я новичок в Android. Пожалуйста, помогите мне в решении этого вопроса. уе.

Спасибо.

ответ

0

ваше создать утверждение неверно, попробуйте следующее:

public void onCreate(SQLiteDatabase DB){ 

    final String CREATE_TABLE="create table if not exists "+ TABLE_NAME + "("+ COLUMN_NAME_READING_ID +" integer primary key autoincrement," 
      +COLUMN_NAME_READING_MODE+" text not null,"+COLUMN_NAME_PASTDATETIME+" date not null,"+COLUMN_NAME_CURRENTDATETIME 
      +" date not null,"+COLUMN_NAME_READINGVALUE+" integer not null"+");"; 
    DB.execSQL(CREATE_TABLE);       

}  

вы должны вставить пробелы после определения столбца.

Ваш SQLiteHelper ошибочно реализован. Взгляните на этот учебник Vogela SQLite

Вы не можете инициировать интерфейс (только Чак Норрис может это сделать!).

Кроме того, вы не можете инициировать абстрактный класс CreateDB. Взгляните на учебник. Это очень хорошо.

+0

как я грустно. Я думаю, что вы сделали что-то не так в методе onClick –

+0

Я изменил код Create, как и сказал, но повторяет ту же проблему. Я не знаю, где все пошло не так. Пожалуйста, помогите мне! – Mahe

+0

Что такое линия WaterReadingMainActivity.java:96 ??? –

1

Существует что-то здесь не так:

 SQLiteDatabase DB; 
     SQLiteOpenHelper helper = null; 
     DB=helper.getWritableDatabase(); 

должно быть что-то вроде этого:

SQLiteOpenHelper mDbHelper = new SQLiteOpenHelper(this); 
SQLiteDatabase DB= mDbHelper.getWritableDatabase(); 
+0

Я ручаюсь за эту очень очень текущую ошибку ... –

+0

@Mahe Строка должна быть: CreateDB mDbHelper = new CreateDB (this); – Gyonder

+0

Сначала он должен удалить реферат по ключевым словам. –

 Смежные вопросы

  • Нет связанных вопросов^_^