创建 table 时出错

Error in creation of table

我的应用程序出现错误,我什至无法启动它。

SqliteDatabase.java

public class SqliteDatabase extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 5;
    private static final String DATABASE_NAME = "myexpenditure";
    private static final String TABLE_EXPENDITURE = "myexpenditures";
    private static final String COLUMN_ID = "id";
    private static final String COLUMN_PLACE = "place";
    private static final String COLUMN_DATE = "date";
    private static final String COLUMN_AMOUNT = "amount";
    private static final String COLUMN_CATEGORIES = "categories";
    private static final String COLUMN_ADDITIONAL_INFO = "additional_info";


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

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String CREATE_EXPENDITURE_TABLE = "CREATE TABLE " + TABLE_EXPENDITURE + "(" + COLUMN_ID + " INTEGER PRIMARY," + COLUMN_PLACE + " TEXT," + COLUMN_DATE + " TEXT," + COLUMN_AMOUNT + " INTEGER," + COLUMN_CATEGORIES + " TEXT," + COLUMN_ADDITIONAL_INFO + " TEXT" + ")" ;
        sqLiteDatabase.execSQL(CREATE_EXPENDITURE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_EXPENDITURE);
        onCreate(sqLiteDatabase);
    }

    public List<Expenditure> listExpenditure() {
        String sql = "select * from " + TABLE_EXPENDITURE;
        SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
        List<Expenditure> storeExpenditure = new ArrayList<>();
        Cursor cursor = sqLiteDatabase.rawQuery(sql, null);
        if (cursor.moveToFirst()) {
            do {
                int id = Integer.parseInt(cursor.getString(0));
                String place = cursor.getString(1);
                String date = cursor.getString(2);
                int amount = Integer.parseInt(cursor.getString(3));
                String category = cursor.getString(4);
                String additional_info = cursor.getString(5);
                storeExpenditure.add(new Expenditure(id, place, date, amount, category, additional_info));
            } while (cursor.moveToNext());
        }
        cursor.close();
        return storeExpenditure;
    }

    public void addExpenditure(Expenditure expenditure){
        ContentValues values = new ContentValues();
        values.put(COLUMN_PLACE,expenditure.getPlace());
        values.put(COLUMN_DATE,expenditure.getDate());
        values.put(COLUMN_AMOUNT,expenditure.getAmount());
        values.put(COLUMN_CATEGORIES,expenditure.getCategories());
        values.put(COLUMN_ADDITIONAL_INFO,expenditure.getAdditional_Info());
        SQLiteDatabase db = this.getWritableDatabase();
        db.insert(TABLE_EXPENDITURE,null,values);
    }

    public void updateExpenditure(Expenditure expenditure){
        ContentValues values = new ContentValues();
        values.put(COLUMN_PLACE,expenditure.getPlace());
        values.put(COLUMN_DATE,expenditure.getDate());
        values.put(COLUMN_AMOUNT,expenditure.getAmount());
        values.put(COLUMN_CATEGORIES,expenditure.getCategories());
        values.put(COLUMN_ADDITIONAL_INFO,expenditure.getAdditional_Info());
        SQLiteDatabase db = this.getWritableDatabase();
        db.update(TABLE_EXPENDITURE,values,COLUMN_ID + " =?",new String[]{String.valueOf(expenditure.getId())});

    }

    public Expenditure findExpenditure(String place){
        String query = "Select * FROM" + TABLE_EXPENDITURE + "WHERE"+ COLUMN_PLACE + " = " + "place";
        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
        Expenditure mExpenditure =null;
        Cursor cursor=sqLiteDatabase.rawQuery(query,null);
        if (cursor.moveToFirst()){
            int id = Integer.parseInt(cursor.getString(0));
            String expenditurePlace = cursor.getString(1);
            String date = cursor.getString(2);
            int amount = Integer.parseInt(cursor.getString(3));
            String category = cursor.getString(4);
            String additional_info = cursor.getString(5);
            mExpenditure = new Expenditure(id,expenditurePlace,date,amount,category,additional_info);

        }
        cursor.close();
        return mExpenditure;
    }

    public void deleteExpenditure(int id){
        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
        sqLiteDatabase.delete(TABLE_EXPENDITURE,COLUMN_ID + " = ?",new String[]{String.valueOf(id)});
    }

}

MainActivity.Java

public class MainActivity extends AppCompatActivity {

private static final String TAG = ExpenditureSummary.class.getSimpleName();
private SqliteDatabase mDatabase;


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

    FrameLayout frameLayout=(FrameLayout)findViewById(R.id.activity_expenditure_summary);
    RecyclerView expenditureView =(RecyclerView)findViewById(R.id.expenditure_list);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    expenditureView.setLayoutManager(linearLayoutManager);

    expenditureView.setHasFixedSize(true);
    mDatabase = new SqliteDatabase(this);

    List<Expenditure> allExpenditure = mDatabase.listExpenditure();

    if (allExpenditure.size() > 0){
        expenditureView.setVisibility(View.VISIBLE);
        ExpenditureAdapter mAdapter = new ExpenditureAdapter(this,allExpenditure);
        expenditureView.setAdapter(mAdapter);
    } else {
        expenditureView.setVisibility(View.GONE);
        Toast.makeText(this, "There is no entries.Start adding now", Toast.LENGTH_SHORT).show();
    }

    FloatingActionButton fab =(FloatingActionButton)findViewById(R.id.fab);

    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
        addTaskDialog();
        }
    });
}

private void addTaskDialog(){
    LayoutInflater inflater = LayoutInflater.from(this);
    View subview = inflater.inflate(R.layout.activity_edit_expenditure_details,null);

    final EditText placeField = (EditText)subview.findViewById(R.id.enter_place);

    //date picker
         final EditText dateField =(EditText)subview.findViewById(R.id.enter_date);
         final Calendar myCalendar = Calendar.getInstance();
         final DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            myCalendar.set(Calendar.YEAR,year);
            myCalendar.set(Calendar.MONTH,monthOfYear);
            myCalendar.set(Calendar.DAY_OF_MONTH,dayOfMonth);
            String myFormat ="dd/MM/yyyy";
            SimpleDateFormat simpleDateFormat =new SimpleDateFormat(myFormat, Locale.UK);
            dateField.setText(simpleDateFormat.format(myCalendar.getTime()));
        }
    };
        dateField.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           new DatePickerDialog(MainActivity.this,datePickerListener,myCalendar.get(Calendar.YEAR),myCalendar.get(Calendar.MONTH),myCalendar.get(Calendar.DAY_OF_MONTH)).show();
        }
    });

    final EditText amountField =(EditText)subview.findViewById(R.id.enter_amount);

    //Spinner
    final Spinner spinnerCategories=(Spinner)subview.findViewById(R.id.enter_category);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.categories, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerCategories.setAdapter(adapter);

    final EditText additional_infoField = (EditText)subview.findViewById(R.id.enter_additional_info);

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Add new expense");
    builder.setView(subview);
    builder.create();

    builder.setPositiveButton("ADD EXPENSE", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            final String place = placeField.getText().toString();
            final String date = dateField.getText().toString();
            final int amount = Integer.parseInt(amountField.getText().toString());
            final String category = spinnerCategories.getSelectedItem().toString();
            final String additional_info = additional_infoField.getText().toString();

            if (TextUtils.isEmpty(place)|| amount <= 0 || TextUtils.isEmpty(category)||TextUtils.isEmpty(date)){
                Toast.makeText(MainActivity.this, "Please input values", Toast.LENGTH_SHORT).show();
            }
            else {
                Expenditure newExpenditure = new Expenditure(place,date,amount,category,additional_info);
                mDatabase.addExpenditure(newExpenditure);
                finish();
                startActivity(getIntent());
            }
        }
    });
    builder.setNegativeButton("CANCEL",new DialogInterface.OnClickListener(){

        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            Toast.makeText(MainActivity.this, "Task Cancelled", Toast.LENGTH_SHORT).show();
        }
    });
    builder.show();
}

        @Override
        protected void onDestroy(){
        super.onDestroy();
        if (mDatabase != null){
        mDatabase.close();
    }
}

}

错误如下:

03-24 10:10:16.844 19709-19709/com.nebula.sebjohn.myexpenses E/AndroidRuntime: FATAL EXCEPTION: main Process: com.nebula.sebjohn.myexpenses, PID: 19709 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.nebula.sebjohn.myexpenses/com.nebula.sebjohn.myexpenses.MainActivity}: android.database.sqlite.SQLiteException: near ",": syntax error (code 1): , while compiling: CREATE TABLE myexpenditures(id INTEGER PRIMARY,place TEXT,date TEXT,amount INTEGER,categories TEXT,additional_info TEXT) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2439) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2499) at android.app.ActivityThread.access0(ActivityThread.java:166) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1360) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5468) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: android.database.sqlite.SQLiteException: near ",": syntax error (code 1): , while compiling: CREATE TABLE myexpenditures(id INTEGER PRIMARY,place TEXT,date TEXT,amount INTEGER,categories TEXT,additional_info TEXT) at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887) at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498) at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) at android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58) at android.database.sqlite.SQLiteStatement.(SQLiteStatement.java:31) at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674) at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1605) at Database.SqliteDatabase.onCreate(SqliteDatabase.java:39) at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:251) at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187) at Database.SqliteDatabase.listExpenditure(SqliteDatabase.java:51) at com.nebula.sebjohn.myexpenses.MainActivity.onCreate(MainActivity.java:50) at android.app.Activity.performCreate(Activity.java:6556) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2392) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2499)  at android.app.ActivityThread.access0(ActivityThread.java:166)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1360)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5468)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

我是 Android 应用程序的新手 development.Please 帮我解决这个问题 issue.I 我正在尝试使用 SQLiteDatabase 将数据存储在我的 phone 本身中。

Build.gradle(模块:app)

    android {
    compileSdkVersion 25
    buildToolsVersion '25.0.0'
    defaultConfig {
        applicationId "com.nebula.sebjohn.myexpenses"
        minSdkVersion 14
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:25.0.1'
    compile 'com.intuit.sdp:sdp-android:1.0.3'
    compile 'com.android.support:design:25.0.1'
    compile 'com.android.support:cardview-v7:25.0.1'
    compile 'com.android.support:recyclerview-v7:25.0.1'
    compile 'com.android.support:support-v4:25.0.1'
    compile 'com.google.code.gson:gson:2.6.1'
    compile 'io.realm:android-adapters:1.4.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}

您的 SQL 查询有问题,您的查询在列名称和 table 名称中缺少撇号。您的查询还缺少主键声明部分中的 KEY 参数。 请修改您的查询如下:

CREATE TABLE `myexpenditures` (
`id`    INTEGER PRIMARY KEY AUTOINCREMENT,
`place` TEXT,
`date`  TEXT,
`amount`    INTEGER,
`categories`    TEXT,
`additional_info`   TEXT
); 

希望对您有所帮助。

创建主键时需要说 PRIMARY KEY,而不仅仅是 PRIMARY:

String CREATE_EXPENDITURE_TABLE = "CREATE TABLE " + TABLE_EXPENDITURE + "(" + COLUMN_ID + " INTEGER PRIMARY KEY," + COLUMN_PLACE + " TEXT," + COLUMN_DATE + " TEXT," + COLUMN_AMOUNT + " INTEGER," + COLUMN_CATEGORIES + " TEXT," + COLUMN_ADDITIONAL_INFO + " TEXT" + ")" ;

使用主键而不是主键

       String CREATE_EXPENDITURE_TABLE = "CREATE TABLE " + TABLE_EXPENDITURE 
        + "(" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
        + COLUMN_PLACE + " TEXT,"
        + COLUMN_DATE + " TEXT,"
        + COLUMN_AMOUNT + " INTEGER,"
        + COLUMN_CATEGORIES + " TEXT," 
        + COLUMN_ADDITIONAL_INFO + " TEXT"
        + ")" ;

你的情况和主键都存在语法错误,所以我已经修复了它,所以你可以看到区别

  String CREATE_EXPENDITURE_TABLE = "CREATE TABLE " + TABLE_EXPENDITURE + "(" + COLUMN_ID + " INTEGER PRIMARY KEY, " + COLUMN_PLACE + " TEXT, " +
        COLUMN_DATE + " TEXT, " + COLUMN_AMOUNT +
        " INTEGER, " + COLUMN_CATEGORIES + " TEXT, " + COLUMN_ADDITIONAL_INFO + " TEXT" + ")";