SQLite Вставить не удается - PullRequest
3 голосов
/ 08 июля 2011

Ну, я боролся с этим все вчера и сегодня, я получил простую вставку SQLite, которая продолжает возвращать -1 в качестве возвращаемого значения, я где-то читал, чтобы изменить имя первичного ключа на _id, но без изменений.

так вот снимки кода.Мои константы для полей:

//BALLS TABLE
public  static final String BALLS_TABLE  = "balls";
public  static final String BALL_ID = "id";
public  static final String BALL_USERID = "userId";
public  static final String BALL_MODEL = "model";
public  static final String BALL_BRAND = "brand";
public  static final String BALL_SERIAL = "serial";
public  static final String BALL_NOTES = "notes";
public  static final String BALL_IMAGE = "image";

, затем на моих createTables (SQLiteDatabase db) я получил

// BALLS TABLE

db.execSQL(
"create table " + BALLS_TABLE +" (" +
BALL_ID + " integer primary key autoincrement not null," +
BALL_USERID + "integer not null," +
BALL_MODEL + " text not null," +
BALL_BRAND + " text not null," +
BALL_SERIAL + " text not null," +
BALL_NOTES + " text not null," +
BALL_IMAGE + " blob" +
");");

создание таблиц работаеткак я получил другие таблицы, которые были заполнены.

и, наконец, весь класс помощника по мячу

package com.kegel.android.bowlermanager.data;

import java.io.ByteArrayOutputStream;
import java.util.ArrayList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

public class BallHelper {

    private SQLiteDatabase database;
    private ArrayList<Ball> currentBalls;
    private Context context;

    public BallHelper(Context context,SQLiteDatabase database)
    {
        this.context = context;
        this.database = database;
        loadBalls();
    }

    public ArrayList<Ball> getCurrentBalls() {
        return currentBalls;
    }

    public Boolean BallExists(long id)
    {
        for (Ball ball : currentBalls)
        {
            if (ball.getId() == id)
                return true;
        }   
        return false;
    }

    public Boolean BallExists(Ball u)
    {
        for (Ball ball : currentBalls)
        {
            if (ball.getId() == u.getId())
                return true;
        }   
        return false;
    }

    public void updateBall(Ball b) {
        assert(null != b);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] by = null;
        if (b.getImage() != null )
        {
            Bitmap bmp = b.getImage();
            bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);   
            by = baos.toByteArray();  

        }
        ContentValues values = new ContentValues();
        values.put(SQLiteOpenDataHelper.BALL_USERID, 1);
        values.put(SQLiteOpenDataHelper.BALL_MODEL, b.getModel());
        values.put(SQLiteOpenDataHelper.BALL_BRAND , b.getBrand());
        values.put(SQLiteOpenDataHelper.BALL_SERIAL , b.getSerial());
        values.put(SQLiteOpenDataHelper.BALL_NOTES, b.getNotes());
        values.put(SQLiteOpenDataHelper.BALL_IMAGE , by);
        if (b.isValid())
        {
            if (b.getId() == 0)
            {
                b.setId(database.insert(SQLiteOpenDataHelper.BALLS_TABLE, null, values));
            }
            else
            {
                long id = b.getId();
                String where = String.format("%s = %d", SQLiteOpenDataHelper.BALL_ID, id);
                database.update(SQLiteOpenDataHelper.BALLS_TABLE, values, where, null);
            }
            loadBalls();    
        }
    }
    public void deleteBalls(Long id) {
        String where = String.format("%s in (%s)", SQLiteOpenDataHelper.BALL_ID, id);
        database.delete(SQLiteOpenDataHelper.BALLS_TABLE, where, null);
        loadBalls();
    }
    public void deleteBalls(Ball u) {
        String where = String.format("%s in (%s)", SQLiteOpenDataHelper.BALL_ID, u.getId());
        database.delete(SQLiteOpenDataHelper.BALLS_TABLE, where, null);
        loadBalls();
    }
        private void loadBalls() {
        byte[] img = null;
        currentBalls = new ArrayList<Ball>();
        //try
        //{
        Cursor ballsCursor = database.query(SQLiteOpenDataHelper.BALLS_TABLE, new String[] {SQLiteOpenDataHelper.BALL_ID,SQLiteOpenDataHelper.USER_ID, SQLiteOpenDataHelper.BALL_MODEL, SQLiteOpenDataHelper.BALL_BRAND, SQLiteOpenDataHelper.BALL_SERIAL, SQLiteOpenDataHelper.BALL_NOTES, SQLiteOpenDataHelper.BALL_IMAGE}, null, null, null, null, null);
        ballsCursor.moveToFirst();
        Ball b;
        if (! ballsCursor.isAfterLast()) {
            do {
                long id = ballsCursor.getInt(0);
                long bowlerId  = ballsCursor.getLong(1);
                String model = ballsCursor.getString(2);
                String brand = ballsCursor.getString(3);
                String serial = ballsCursor.getString(4);
                String notes = ballsCursor.getString(5);
                img = ballsCursor.getBlob(6);
                Bitmap bmp=BitmapFactory.decodeByteArray(img,0,img.length);
                b = new Ball(context,bowlerId,model,brand,serial,notes);
                b.setId(id);
                b.setImage(bmp);
                currentBalls.add(b);
            } while (ballsCursor.moveToNext());
        }
        ballsCursor.close();
    }
}

Вторая пара глаз здесь пригодится!так что, если кто-нибудь сможет что-то найти здесь или сообщить мне, если я что-то упустил, я буду очень признателен.Я уже проверил значения на b (даже проходит мою внутреннюю проверку), но вставка, подобная этой, не удастся:

Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.fake_pofile);
Ball ball = new Ball(this,1, "Test", "Test", "", "");
ball.setImage(bm);
mHelper.updateBall(ball);

Ответы [ 2 ]

3 голосов
/ 09 июля 2011

Ну ... как я, никто не заметил в коде для создания таблицы, между полем BALL_USERID я не оставлял пробела, так что это было целое слово, забавная вещь, которую предполагает db.exec генерировать исключения, но в этом случае не принял и принял странное имя в качестве поля без типа и создал таблицу без поля "userId", но "useridinteger" без типа (есть ли тип по умолчанию, если вы не установили один ??)

Иногда это просто те маленькие вещи, которые могут заставить вас сойти с ума.

0 голосов
/ 19 января 2019

Я знаю, что это старый пример, но для тех, кто ищет образец Objective C, это хорошо.Тем не менее, обязательно поместите строки sqlite3_reset (оператор) ДО операторов возврата.В противном случае код работает только при первом сохранении или поиске.

...