Импорт файла CSV в SQLite - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь импортировать файл CSV в базу данных SQLite, но получаю ошибки ниже.

file.csv

EMP0003 | образец | S @ mple | SATO | ТЕСТ | назначения | 00008888 | ST0001 | EMP0003 | Восток Location | 0000001XABC ----> вот мой CSV-файл, но он идет только в E '|' M '|' P '|' 0 '|' 0 '|' 0 '|' 3 '|' | '|' s '|' a '|' m 'не весь текст

String columns = "employee_num, username, password, firstname, lastname, address, contact, van, salesman_code, station_code, machine_id";
        String str1 = "INSERT INTO " + tableName + " (" + columns + ") values(" ;
        String str2 = ");";
            mydb.beginTransaction();

        while ((line = buffer.readLine()) !=null ) {
            StringBuilder sb = new StringBuilder(str1);
            String[] str = line.split("'|' ");
            sb.append("'" + str[0] + "'|'");
            sb.append(str[1]+ "'|'");
            sb.append(str[2]+ "'|'");
            sb.append(str[3]+ "'|'");
            sb.append(str[4]+ "'|'");
            sb.append(str[5]+ "'|'");
            sb.append(str[6]+ "'|'");
            sb.append(str[7]+ "'|'");
            sb.append(str[8]+ "'|'");
            sb.append(str[9]+ "'|'");
            sb.append(str[10]+ "'|'");
            sb.append(str[11].replace("'", "") + "'");
            mydb.execSQL(sb.toString());
    }

Error

Error : E/SQLiteLog: (1) near "'m'": syntax error
/ W/System.err: android.database.sqlite.SQLiteException: near "'m'": syntax error (code 1): , while compiling: INSERT INTO tbl_user (employee_num, username, password, firstname, lastname, address, contact, van, salesman_code, station_code, machine_id) values('','E'|'M'|'P'|'0'|'0'|'0'|'3'|'|'|'s'|'a'|'m'
/ W/System.err:     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
/ W/System.err:     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
/ W/System.err:     at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
/ W/System.err:     at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
/ W/System.err:     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
/ W/System.err:     at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
/ W/System.err:     at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1677)
 W/System.err:     at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1608)

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Я считаю, что у вас есть ряд вопросов.

  1. Вы не разделяете значения правильно, я полагаю, вы хотите String[] str = line.split("\\|"), чтобы разделить данные в |
  2. Вы используете неверные разделители между значениями в SQL. Каждое значение должно быть отделено от другого значения запятой.
  3. Вы опускаете закрывающую скобку.

Тем не менее

Вы можете упростить ситуацию с помощью удобного метода SQLiteDatabase insert , который создаст SQL от вашего имени.

Рассмотрим следующий рабочий пример (хотя бы для вставки рассматриваемой строки): -

Помощник по базам данных (особенно метод addUser ): -

public class DBHelper extends SQLiteOpenHelper {

    public static final String DBNAME = "mydb";
    public static final int DBVERSION = 1;

    public static final String TABLENAME = "tbl_user";
    public static final String USER_COL_EMPLOYEENUM = "employee_num";
    public static final String USER_COL_USERNAME = "username";
    public static final String USER_COL_PASSWORD = "password";
    public static final String USER_COL_FIRSTNAME = "firstname";
    public static final String USER_COL_LASTNAME = "lastname";
    public static final String USER_COL_ADDRESS = "address";
    public static final String USER_COL_CONTACT = "contact";
    public static final String USER_COL_VAN = "van";
    public static final String USER_COL_SALESMANCODE = "salesman_code";
    public static final String USER_COL_STATIONCODE = "station_code";
    public static final String USER_COL_MACHINEID = "machine_id";

    SQLiteDatabase mDB;

    public DBHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
        mDB = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String user_crt = "CREATE TABLE If NOT EXISTS " + TABLENAME + "(" +
                USER_COL_EMPLOYEENUM + " TEXT PRIMARY KEY," +
                USER_COL_USERNAME + " TEXT UNIQUE," +
                USER_COL_PASSWORD + " TEXT," +
                USER_COL_FIRSTNAME + " TEXT," +
                USER_COL_LASTNAME + " TEXT," +
                USER_COL_ADDRESS + " TEXT," +
                USER_COL_CONTACT + " TEXT," +
                USER_COL_VAN + " TEXT," +
                USER_COL_SALESMANCODE + " TEXT, " +
                USER_COL_STATIONCODE + " TEXT," +
                USER_COL_MACHINEID + " TEXT" +
                ")";
        db.execSQL(user_crt);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {

    }

    public long addUser(String employeeNumber,
                        String userName,
                        String password,
                        String firstname,
                        String lastname,
                        String address,
                        String contact,
                        String van,
                        String salesmanCode,
                        String stationCode,
                        String machineId) {

        ContentValues cv = new ContentValues();
        cv.put(USER_COL_EMPLOYEENUM,employeeNumber);
        cv.put(USER_COL_USERNAME,userName);
        cv.put(USER_COL_PASSWORD,password);
        cv.put(USER_COL_FIRSTNAME,firstname);
        cv.put(USER_COL_LASTNAME,lastname);
        cv.put(USER_COL_ADDRESS,address);
        cv.put(USER_COL_CONTACT,contact);
        cv.put(USER_COL_VAN,van);
        cv.put(USER_COL_SALESMANCODE,salesmanCode);
        cv.put(USER_COL_STATIONCODE,stationCode);
        cv.put(USER_COL_MACHINEID,machineId);
        return mDB.insert(TABLENAME,null,cv);
    }

    public void logAll() {
        Cursor csr = mDB.query(TABLENAME,null,null,null,null,null,null);
        while (csr.moveToNext()) {
            StringBuilder sb = new StringBuilder(" Row ").append(String.valueOf(csr.getPosition()));
            for (int i =0; i < csr.getColumnCount(); i++) {
                sb.append("\n\tColumn ").append(csr.getColumnName(i)).append(" has a value of ").append(csr.getString(i));
            }
            Log.d("TABLEINFO",sb.toString());
        }
        csr.close();
    }
}

Это используется в упражнении по типу: -

public class MainActivity extends AppCompatActivity {

    DBHelper mDBHlpr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDBHlpr = new DBHelper(this);

        String currentline = "EMP0003|sample|S@mple|SATO|TEST|destination|00008888|ST0001|EMP0003|East Location|0000001XABC";

        String[] values = currentline.split("\\|"); //<<<<<<<<<< SPLT at each |

        // Only use if there are the 11 columns
        if (values.length == 11) {
            mDBHlpr.addUser(
                    values[0],
                    values[1],
                    values[2],
                    values[3],
                    values[4],
                    values[5],
                    values[6],
                    values[7],
                    values[8],
                    values[9],
                    values[10]
            );
        }
        mDBHlpr.logAll(); //<<<<<<<<<< Write the data in the table to the log
    }
}

При запуске это приведет к (который будет выглядеть как результат, который вы хотите): -

11-06 08:34:29.022 1574-1574/? D/TABLEINFO:  Row 0
      Column employee_num has a value of EMP0003
      Column username has a value of sample
      Column password has a value of S@mple
      Column firstname has a value of SATO
      Column lastname has a value of TEST
      Column address has a value of destination
      Column contact has a value of 00008888
      Column van has a value of ST0001
      Column salesman_code has a value of EMP0003
      Column station_code has a value of East Location
      Column machine_id has a value of 0000001XABC

Как вы можете видеть, нет необходимости играть в сборку SQL, он создан для вас.

  • P.S. Я предположил, что номер сотрудника должен быть уникальным, и поэтому он стал ПЕРВИЧНЫМ КЛЮЧОМ (это остановит добавление дубликатов).

Вы могли бы адаптировать вышеупомянутое с помощью (после включения метода addUser или эквивалентного в зависимости от имен столбцов () настоятельно рекомендуется использовать константы для имен столбцов, а не жесткое кодирование их )): -

    while ((line = buffer.readLine()) !=null ) {
        String[] values = line.split("\\|"); //<<<<<<<<<< SPLIT at each |

        // Only use if there are the 11 columns
        if (values.length == 11) {
            mydb.addUser(
                    values[0],
                    values[1],
                    values[2],
                    values[3],
                    values[4],
                    values[5],
                    values[6],
                    values[7],
                    values[8],
                    values[9],
                    values[10]
            );
        }
    }
0 голосов
/ 06 ноября 2018

Одиночные кавычки ' являются проблемой здесь. Они генерируют недопустимые запросы SQL. Вместо того чтобы писать необработанные SQL-запросы, вы должны использовать для этого ContentValues ​​или скомпилированные операторы.

Использование подготовленных заявлений

String sql = "INSERT INTO " + tableName + " ( name, description ) VALUES ( ?, ? )";
SQLiteStatement stmt = db.compileStatement(sql);
stmt.bindString(1, "value");
stmt.execute();

Использование значений содержимого

ContentValues values = new ContentValues();
long retvalue = 0;
values.put("_id", id_here);
values.put("text", your_text_here);
db.insert("table",null, values); // Check the docs for the correct parameters here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...