数据库创建不成功

时间:2017-12-02 11:42:12

标签: java android sqlite

我正在尝试在android中创建一个数据库并尝试将两个数据保存到其中。 我的 dataBaseHelper 文件如下

package com.example.imad.sos;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

public class DataBaseHelper extends SQLiteOpenHelper {

    public static final String databaseName = "sostable.db";
    public static final String tableName = "sostable";
    public static final String nameColum = "name";
    public static final String phoneColum = "phonenumber";

    public DataBaseHelper(Context context) {
        super(context, databaseName, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table " + tableName +" ( name text primary key,phonenum text)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists "+tableName);
        onCreate(db);
    }

    public boolean insertData(String name, String phone)
    {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(nameColum, name);
        contentValues.put(phoneColum, phone);

        long result = db.insert(tableName, null, contentValues);
        if(result == -1)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
}

这是我尝试将数据插入数据库的 AddContact 活动:

DataBaseHelper dataBaseHelper = new DataBaseHelper(this);
boolean insertSuccess;

String name = txtName.getText().toString();
String phone = txtPhone.getText().toString();

if(name.equals("") || phone.equals("")) {
    Toast.makeText(AddContacts.this, "One of the fields is empty",Toast.LENGTH_LONG).show();
} else {
    insertSuccess = dataBaseHelper.insertData(name, phone);
    if(insertSuccess == true) {
        Toast.makeText(AddContacts.this, "Insertion Successful", Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(AddContacts.this, "Insertion Failed", Toast.LENGTH_LONG).show();
    }
}

这是我的清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.imad.sos">

    <uses-permission android:name="android.permission.SEND_SMS" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".AddContacts" />
        <activity android:name=".ShowContacts"></activity>
    </application>

</manifest>

每当我在 AddContacts 中运行代码时,会弹出消息插入失败。我是新手,在我的代码中找不到错误。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我认为问题在于您的列名不匹配。

使用db.execSQL("create table " + tableName +" ( name text primary key,phonenum text)");

创建表格时

因此,列名称将为名称 phonenum

但是,在insertData方法中,派生列名称将为 phonenumber

要解决此问题,您可以

  • 1)将db.execSQL("create table " + tableName +" ( name text primary key,phonenum text)");更改为db.execSQL("create table " + tableName +" ( name text primary key,phonenumber text)");。 (*)然后您需要删除应用程序的数据,卸载应用程序或增加数据库版本(super(context, databaseName, null, 1);的第4个参数)

  • 2)将public static final String phoneColum = "phonenumber";更改为public static final String phoneColum = "phonenum";

我建议您而不是上述任何内容,而是始终使用单个来源列名称并将db.execSQL("create table " + tableName +" ( name text primary key,phonenum text)");更改为: -

    db.execSQL("create table " + tableName +" (" + nameColum + " text primary key," + phoneColum + " text)");

(*)这需要您删除App的数据,卸载App或增加数据库版本号。

(*)需要删除App。卸载它或增加数据库版本,是因为只有在数据库不存在时才会自动调用onCreate方法。前两个删除数据库,因此调用onCreate。增加数据库版本会导致调用onUpgrade方法。请注意,这三种方法都会导致现有数据丢失。