-2

请帮助,错误是“返回的sqlite:错误代码= 1,msg =靠近“端口”:语法错误,请帮助“:

此代码强制停止我的应用程序,请帮助纠正错误。

public static String DATABASENAME = "ftpdb";
public static String FTPTABLE = "fAccounts";
public static String colId = "id";
public static String colNmae = "name";
public static String colUserName = "username";
public static String colPassword = "password";
public static String colPort = "port";
public static String colHost = "host";
private ArrayList<FTPModel> ftpList = new ArrayList<FTPModel>();
Context c;

public DatabaseHelper(Context context) {
    super(context, DATABASENAME, null, 33);
    c = context;
}

@Override
public void onCreate(SQLiteDatabase db) {

    db.execSQL("CREATE TABLE if not exists ftpAccounts(id INTEGER PRIMARY KEY AUTOINCREMENT,"
            + "name" + " TEXT ," + "username" + " TEXT," + "password" + " TEXT)" + "port" + " TEXT)" + "host" + " TEXT)");

}

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

public void addProduct(FTPModel fm) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put("name", fm.name);
    contentValues.put("username", fm.username);
    contentValues.put("password", fm.password);
    contentValues.put("port", fm.port);
    contentValues.put("host", fm.host); 

    db.insert("ftpAccounts", null, contentValues);
    db.close();

}


public void removeProduct(String name, String username, String password, String port, String host) {
    try {

        String[] args = { name };
        getWritableDatabase().delete("ftpAccounts", "name=?", args);

    } catch (Exception e) {

    }
}

public ArrayList<FTPModel> getAccounts() {

    ftpList.clear();

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery("select * from ftpAccounts", null);
    if (cursor.getCount() != 0) {
        if (cursor.moveToFirst()) {
            do {
                FTPModel item = new FTPModel();

                item.name = cursor.getString(cursor
                        .getColumnIndex("name"));

                item.username = cursor.getString(cursor
                        .getColumnIndex("username"));

                item.password= cursor.getString(cursor
                        .getColumnIndex("password"));

                item.port= cursor.getString(cursor
                        .getColumnIndex("port"));

                item.host= cursor.getString(cursor
                        .getColumnIndex("host"));

                ftpList.add(item);

            } while (cursor.moveToNext());
        }
    }
    cursor.close();
    db.close();
    return ftpList;
}

}

请帮助更正代码,非常感谢

4

2 回答 2

2

改变这个:

db.execSQL("CREATE TABLE if not exists ftpAccounts(id INTEGER PRIMARY KEY AUTOINCREMENT,"
            + "name" + " TEXT ," + "username" + " TEXT," + "password" + " TEXT)" + "port" + " TEXT)" + "host" + " TEXT)");

对此:

db.execSQL("CREATE TABLE if not exists ftpAccounts(" + colId + "INTEGER PRIMARY KEY AUTOINCREMENT,"
            + colName + " TEXT ," + colUserName + " TEXT," + colPassword + " TEXT," + colPort + " TEXT," + colHost + " TEXT)");

你有几个额外的括号而不是逗号。完全忘记了您想使用变量作为列名。

于 2013-06-17T21:40:01.987 回答
1

如果您发现自己遇到SQL 语法错误,您应该(暂时)在执行之前以某种方式将其打印出来。

这几乎总能准确地告诉你问题出在哪里。如果您在这种情况下对查询执行此操作,您会看到如下内容:

CREATE TABLE if not exists ftpAccounts(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT ,username TEXT,password TEXT)port TEXT)host TEXT)

(并且稍微重新格式化以使阅读更容易):

CREATE TABLE if not exists ftpAccounts(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT ,
    username TEXT,
    password TEXT)port TEXT)host TEXT)

现在看到了吗?应该可以立即识别出问题所在。在逗号应该在的列说明符password和列说明符的末尾有右括号。port


而且,顺便说一句,我不完全确定您认为通过连接所有这些字符串可以获得什么。如果您想要可读的代码,这是一个足够好的理由,但我建议最好这样做:

db.execSQL("CREATE TABLE if not exists ftpAccounts(" +
           "    id       INTEGER PRIMARY KEY AUTOINCREMENT," +
           "    name     TEXT," +
           "    username TEXT," +
           "    password TEXT," +
           "    port     TEXT," +
           "    host     TEXT)"
);

因此您可以在易于区分的部分中看到语句组件。

您可能想要查看的另一件事是port作为文本项目的适用性。它可能会更好地存储为整数类型。

于 2015-05-27T01:42:17.017 回答