Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQLite DatabaseHelper类未创建数据库_Java_Android_Sqlite_Android Sqlite - Fatal编程技术网

Java SQLite DatabaseHelper类未创建数据库

Java SQLite DatabaseHelper类未创建数据库,java,android,sqlite,android-sqlite,Java,Android,Sqlite,Android Sqlite,嗨,我一直在开发一个简单的计时器应用程序,在数据库中存储圈数。我已经创建了一个数据库助手类。当我试图从我的活动中插入数据时,我得到一个错误,说没有创建这样的表。为了简单起见,我从这里的活动中删除了一些代码(按钮代码等) 起初,我认为使用常量有问题,但我创建的表中没有任何常量,我得到了相同的错误。 更新:我认为在DBHelper中从未调用过onCreate DatabaseHelper.java package com.example.andrei.gymhelp; import android

嗨,我一直在开发一个简单的计时器应用程序,在数据库中存储圈数。我已经创建了一个数据库助手类。当我试图从我的活动中插入数据时,我得到一个错误,说没有创建这样的表。为了简单起见,我从这里的活动中删除了一些代码(按钮代码等) 起初,我认为使用常量有问题,但我创建的表中没有任何常量,我得到了相同的错误。
更新:我认为在DBHelper中从未调用过onCreate

DatabaseHelper.java

package com.example.andrei.gymhelp;

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;


public class DatabaseHelper extends SQLiteOpenHelper {

private static final String TAG = "SQLMessage";
private static final String DATABASE_NAME = "StoredResults.db";
private static final int DATABASE_VERSION = 2;
private static DatabaseHelper mDatabaseInstance = null;
private Context mContext;


public static DatabaseHelper newInstance(Context context){
    //first check to see if the database helper
    //member data is null
    //create a new one if it is null

    if (mDatabaseInstance == null){
        mDatabaseInstance = new DatabaseHelper(context.getApplicationContext());
    }

    //either way we have to always return an instance of
    //our database class each time this method is called
    return mDatabaseInstance;
}



public DatabaseHelper(Context context) {

    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    mContext = context;
}
private static final String CREATE_TABLE_LAPS = "create table results_table "
        + "("
        + "_id" + " integer primary key autoincrement, "
        + "timestamp" + " text not null, "
        + "laps" + " text not null, "
        + ")";

@Override
public void onCreate(SQLiteDatabase db) {
   try{
       db.execSQL(CREATE_TABLE_LAPS);
       Log.d(TAG, "TABLE WAS CREATED ");
   } catch (SQLException e) {
       Log.d(TAG, " Error create database " + e.getMessage());
   }
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + Constants.LAPS_TABLE);
    onCreate(db);

 }
}
TimerActivity.java

public class TimerActivity extends AppCompatActivity {

private Context context;
private TextView timer;
private Button btnStart;
private Button btnLap;
private Button btnStop;
private Button btnSave;
private TextView laps;
private int lapsCounter = 1;
private ScrollView scrollLaps;
private boolean saved = false;
private String savedLaps = "";
private static final String TAG = "MESSAGE";
Date dateAndTime = new Date();
private String sequenceTimestamp;

private DatabaseHelper mDBHelper;
private SQLiteDatabase mDatabase;

private Chronometer mainChronometer;
private Thread threadChrono;

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


    mDBHelper = new DatabaseHelper(this);
    mDatabase  = mDBHelper.getWritableDatabase();

    btnSave.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mainChronometer != null) {

                Context context = getApplicationContext();
                CharSequence text = getString(R.string.chrono_not_stopped);
                int duration = Toast.LENGTH_SHORT;

                Toast toast = Toast.makeText(context, text, duration);
                toast.show();

            }else{
                if (!saved) {

                    Log.v(TAG, "LAPS = " + savedLaps);
                    Log.v(TAG, String.valueOf(System.currentTimeMillis()));
                    saved = true;

                    Context context = getApplicationContext();
                    CharSequence text = getString(R.string.saved_toast);
                    int duration = Toast.LENGTH_SHORT;

                    Toast toast = Toast.makeText(context, text, duration);
                    toast.show();
                    sequenceTimestamp = (String) DateFormat.format("hh:mm:ss dd-MM-yyyy", dateAndTime.getTime());

                    saveResultsToDatabase(sequenceTimestamp, savedLaps);
                    Log.v(TAG, sequenceTimestamp);

                    } else {
                        Context context = getApplicationContext();
                        CharSequence text = getString(R.string.alreadysaved_toast);
                        int duration = Toast.LENGTH_SHORT;

                        Toast toast = Toast.makeText(context, text, duration);
                        toast.show();
                    }
            }
        }
    });

}

public void updateTimer(final String time){
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            timer.setText(time);
        }
    });
}
public void saveResultsToDatabase(String timestamp,String stringOfLaps) {
    //if (mDatabase != null) {
        //prepare the transaction information that will be saved to the database
        ContentValues values = new ContentValues();
        values.put(Constants.COLUMN_TIMESTAMP, timestamp);
        values.put(Constants.COLUMN_LAPS, stringOfLaps);

        try {


            Log.i(TAG,"SAVE RESULTS WAS CALLED");
            mDatabase.insert(Constants.LAPS_TABLE, null, values);

            mDatabase.close();
        }catch (SQLException e){
            Log.d(TAG,e.getMessage());
        }
    //}
}

}
错误

01-08 22:09:09.081 10656-10656/com.example.andrei.gymhelp E/SQLiteLog: (1) 
01-08 22:09:09.083 10656-10656/com.example.andrei.gymhelp E/SQLiteDatabase: Error inserting timestamp=10:09:04 08-01-2018 laps=Lap 1: 
00:00:00:786|Lap 2: 00:00:01:283|Lap 3: 00:00:01:756|Lap 5: 00:00:02:177|
 android.database.sqlite.SQLiteException: no such table: results_table (Sqlite code 1): , while compiling: INSERT INTO results_table(timestamp,laps) VALUES (?,?), (OS error - 2:No such file or directory)
     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:910)
     at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:521)
     at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:603)
     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:63)
     at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
     at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1725)
     at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1593)
     at com.example.andrei.gymhelp.TimerActivity.saveResultsToDatabase(TimerActivity.java:186)
     at com.example.andrei.gymhelp.TimerActivity$4.onClick(TimerActivity.java:150)
     at android.view.View.performClick(View.java:5646)
     at android.view.View$PerformClick.run(View.java:22459)
     at android.os.Handler.handleCallback(Handler.java:761)
     at android.os.Handler.dispatchMessage(Handler.java:98)
     at android.os.Looper.loop(Looper.java:156)
     at android.app.ActivityThread.main(ActivityThread.java:6523)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
01-08 22:09:09.081 10656-10656/com.example.andrei.gymhelp E/SQLiteLog:(1)
01-08 22:09:09.083 10656-10656/com.example.andrei.gymhelp E/SQLiteDatabase:插入时间戳时出错=10:09:04 08-01-2018圈数=第1圈:
00:00:00:786 |第2圈:00:00:01:283 |第3圈:00:00:01:756 |第5圈:00:00:02:177|
android.database.sqlite.SQLiteException:没有这样的表:results_table(sqlite代码1):,编译时:插入results_table(timestamp,laps)值(?,),(操作系统错误-2:没有这样的文件或目录)
位于android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法)
位于android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:910)
位于android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:521)
位于android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:603)
位于android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:63)
位于android.database.sqlite.SQLiteStatement.(SQLiteStatement.java:31)
位于android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1725)
位于android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1593)
位于com.example.andrei.gymhelp.TimerActivity.saveResultsToDatabase(TimerActivity.java:186)
在com.example.andrei.gymhelp.TimerActivity$4.onClick(TimerActivity.java:150)
在android.view.view.performClick上(view.java:5646)
在android.view.view$PerformClick.run(view.java:22459)
位于android.os.Handler.handleCallback(Handler.java:761)
位于android.os.Handler.dispatchMessage(Handler.java:98)
位于android.os.Looper.loop(Looper.java:156)
位于android.app.ActivityThread.main(ActivityThread.java:6523)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)

数据库确实存在。但是,数据库中不存在表结果\u表

由于语法错误,未创建该表。最后定义的laps列后面有一个逗号,因此需要另一个列定义

若要修复此更改,请将
+“laps”+“text not null”
更改为
+“laps”+“text not null”
(即删除末尾的逗号)


只有当数据库不存在时才会调用
onCreate
方法,在重新运行应用程序之前,您应该a)删除应用程序的数据或b)卸载应用程序。

我建议您不要在数据库帮助器类中捕获SQLException。这将帮助您立即在代码中找到语法错误。如果您想管理不可预见的错误并向用户显示适当的消息,则在UI代码中使用try…catch语句更合适。我会记住这一点,干杯!谢谢,3小时后我也发现了错误:(