1

我构建了一个相同的应用程序,它从用户那里获取数据。我试图将数据保存到 SQLite 数据库中。当我运行该应用程序时,界面似乎运行良好。但是当我点击“保存”按钮时,应用程序通过给出错误“不幸的是应用程序已关闭”而关闭。不知道原因。我检查了数据库是否创建,发现它没有创建。

这是我的 MainActivity 类。

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的新手。请任何人帮助我解决这个问题。

谢谢。

4

2 回答 2

1

这里有问题:

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

应该是这样的:

    SQLiteOpenHelper mDbHelper = new SQLiteOpenHelper(this);
SQLiteDatabase DB= mDbHelper.getWritableDatabase();
于 2013-03-01T11:57:48.350 回答
0

你的 create 语句是错误的,试试这个:

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

您无法启动界面(只有 Chuck Norris 可以这样做!)。

此外,您无法启动抽象类 CreateDB。看看教程。这很棒。

于 2013-03-01T11:54:37.093 回答