【问题标题】:Can't insert data into db sqLite无法将数据插入 db sqLite
【发布时间】:2014-09-08 10:17:46
【问题描述】:

我无法以正确的方式将列表视图中的一些数据插入到我的数据库 sqLite。我有一个关于我的项目的课程:

public class Corsa
 {
    private int id;
    public String oraPartenza;
    public String oraArrivo;
    public String partenza;
    public String arrivo;
    public String codiceLinea;
    public String codiceCorsa;
    public String tipoCorsa;
    public String linkDettaglio;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }


    /*@Override
    public String toString() {
        return oraPartenza + partenza + oraArrivo + arrivo;
    }*/

    public Corsa() {

    }

    public Corsa(String partenza, String arrivo, String oraPartenza, String oraArrivo) {
        super();
        this.arrivo = arrivo;
        this.partenza = partenza;
        this.oraPartenza = oraPartenza;
        this.oraArrivo = oraArrivo;
    }

    // partenza
    public String getPartenza() {
        return partenza;
    }
    public void setPartenza(String partenza) {
        this.partenza = partenza;
    }

    // arrivo
    public String getArrivo() {
        return arrivo;
    }
    public void setArrivo(String arrivo) {
        this.arrivo = arrivo;
    }

    // ora partenza
    public String getOraPartenza() {
        return oraPartenza;
    }
    public void setOraPartenza(String oraPartenza) {
        this.oraPartenza = oraPartenza;
    }

    // ora arrivo
    public String getOraArrivo() {
        return oraArrivo;
    }
    public void setOraArrivo(String oraArrivo) {
        this.oraArrivo = oraArrivo;
    }
}

该类用于从网络检索信息并将数据放入列表视图中。完美运行,我有一个带有自定义适配器的列表视图,其中显示了我想要的每个数据。现在我将从该列表视图中获取数据并创建另一个列表,例如,仅从所选项目中的“Partenza”和“Arrivo”并将它们放入。我创建的助手:

public class SqlHelper extends SQLiteOpenHelper {
    //Do un nome al DB
    private static final String DB_NOME = "PREF";
    private SqlHelper mMioDbHelper = null;
    SQLiteDatabase db;

    // variabili x inserimento
    private static final String KEY_ID = "id";
    private static final String KEY_PARTENZA = "partenza";
    private static final String KEY_ORA_PARTENZA = "oraPartenza";
    private static final String KEY_ARRIVO = "arrivo";
    private static final String KEY_ORA_ARRIVO = "oraArrivo";

    String TABLE_PREFERITI = "preferiti";
    /**
     * Numero della versione del database.
     * 
     * La numerazione della vesione del database deve iniziare dal numero 1.
     * Quando viene specificata una nuova versione android useguirà la funzione onUpgrade.
     */
    private static final int DB_VERSIONE = 1;

    public SqlHelper(Context context) {
        super(context, DB_NOME, null, DB_VERSIONE);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        /*
         * creazione della tabella PREFERITI
         */
        String sql = "CREATE TABLE preferiti"; 
        sql += "(_id INTEGER PRIMARY KEY,";
        sql += "partenza TEXT NOT NULL,";
        sql += "arrivo TEXT,";
        sql += "oraPartenza TEXT,";
        sql += "oraArrivo TEXT);";


        //Eseguo la query
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS "+ DB_NOME);

        onCreate(db);
    }

    public void addCorsa(Corsa corsaDett, int id) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();

        values.put(KEY_ID, corsaDett.getId());
        values.put(KEY_PARTENZA, corsaDett.getPartenza());
        values.put(KEY_ORA_PARTENZA, corsaDett.getOraPartenza());
        values.put(KEY_ARRIVO, corsaDett.getArrivo());
        values.put(KEY_ORA_ARRIVO, corsaDett.getOraArrivo());

        // insert valori
        db.insert(TABLE_PREFERITI, null, values);

        // chiudo il db
        db.close();
        Log.d("addCorsa", corsaDett.toString());
    }

    //Get All Corse
    public List<Corsa> getAllCorse() {
        List<Corsa> corse = new ArrayList<Corsa>();

        // 1. build the query
        String query = "SELECT * FROM " + TABLE_PREFERITI;

        // 2. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query, null);

        // 3. go over each row, build book and add it to list
        Corsa corsaAll = null;
        if (cursor.moveToFirst()) {
            do {
                corsaAll = new Corsa();
                corsaAll.setId(Integer.parseInt(cursor.getString(0)));
                corsaAll.setPartenza((cursor.getString(1)));
                corsaAll.setArrivo((cursor.getString(2)));
                corsaAll.setOraPartenza(((cursor.getString(3))));
                corsaAll.setOraArrivo((cursor.getString(4)));

                // Add book to books
                corse.add(corsaAll);
            } while (cursor.moveToNext());
        }

        Log.d("getAllBooks()", corse.toString());

        // return books
        return corse;
    }

    //Deleting single row
    public void deleteRow(Corsa corsa) {

        // 1. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();

        // 2. delete

        db.delete(TABLE_PREFERITI,
                  KEY_ID + " = ?",
                  new String[] { String.valueOf(corsa.getId())}
                  );

        // 3. close
        db.close();

        Log.d("deleteCorsa", corsa.toString());

    }

}

这是item中的onlongClick:

mListView.setOnItemLongClickListener(new OnItemLongClickListener(){

                @Override
                public boolean onItemLongClick(AdapterView<?> p1, View p2, int p3, long p4)
                {
                    addToDb(mListView.toString());
                    return true;
                }           


            });

和方法addToDB:

protected void addToDb (String input) {
        value++;
        mMioDbHelper = new SqlHelper(this);
        mMioDbHelper.addCorsa(new Corsa(input, input, input, input), value);
        corsa = mMioDbHelper.getAllCorse();

    }

以这种方式检索其他活动中的数据:

mMioDbHelper = new SqlHelper(getActivity());
        list = mMioDbHelper.getAllCorse();

        if (list.isEmpty()) {
            listaPreferiti.setAdapter(null);
        } else {
            adapter = new PreferitiItemAdapter(getActivity(), list);
            listaPreferiti.setAdapter(adapter);

        }

现在..它会保存数据,但它不会显示适配器位置的每个项目,但似乎它需要整个字符串 oraPartenza " / " partenza " " + oraArrivo " / " arrivo; 并在适配器中重复整行。插入有问题?

【问题讨论】:

    标签: android sqlite listview android-listview


    【解决方案1】:

    您的 addToDb() 函数不正确。重要的是要认识到 mListView.toString() 只会给你一个单一的长字符串。

    当您调用 mMioDbHelper.addCorsa(new Corsa(input, input, input, input), value) 时,您实际上是在创建一个新的 Corsa,其中每个变量都设置为 mListView.toString()。

    您需要做的是解析 mListView.toString 并单独获取每条信息,然后创建一个新的 Corsa。

    因此,您的 addToDb 应该如下所示,其中每个输入对应于 Corsa 的某个变量:

    protected void addToDb (String input1, String input2, String input3, String input4) {
        value++;
        mMioDbHelper = new SqlHelper(this);
        mMioDbHelper.addCorsa(new Corsa(input1, input2, input3, input4), value);
        corsa = mMioDbHelper.getAllCorse();
    }
    

    另外,你为什么不使用 listview.getItemAtPosition()?

    编辑:另外,您应该尝试将您的 id 设置为 AUTO INCREMENT。这将比您每次都增加价值要容易。

    编辑 2:

    protected void addToDb (Corsa c) {
        mMioDbHelper = new SqlHelper(this);
        mMioDbHelper.addCorsa(c);
        corsa = mMioDbHelper.getAllCorse();
    }
    

    基本上,您的 list.getItemAtPosition 应该返回一个 Corsa 实例,您将其传递给 addToDb()。

    【讨论】:

    • 好的,但是这样helper中的addCorse方法一定要改了吧?
    • 所以在onClick中会是:addToDb(input.toString(), input.toString(), input.toString(), input.toString());?
    • 你能帮我完成这个项目吗?我可以给你发一封电子邮件.. 谢谢
    • 现在列表似乎是空的.. 听我说.. 你可以给我写信吗:dellai.davide@gmail.com ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    相关资源
    最近更新 更多