【问题标题】:Problem with insert data in SQLite Android Studio在 SQLite Android Studio 中插入数据的问题
【发布时间】:2020-04-11 09:06:48
【问题描述】:

我在 Android Studio 中的应用程序的另一个问题。我尝试在“SQLite”中添加数据,从我的观点来看,代码似乎是正确的,考虑到我刚开始编程 java。似乎出了点问题,没有显示“添加成功”的消息,并且 'setText=" "' 不起作用。

主java文件-“MainFragment”

package com.example.licenta23;

import android.Manifest;
import android.app.Activity;
import android.app.AppComponentFactory;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;

import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class MainFragment extends Fragment {

EditText actv1, edtModel, actv2, actv3, actv4, edtFabricatie, edtPret;
Button btnChoose, btnAdd, btnList;
ImageView imageView3;

final int REQUEST_CODE_GALLERY = 999;

public static SQLiteHelper sqLiteHelper;

private List<MarcaItem> marcaList;


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_main, container, false);

    init(view);
    fillMarcaList();


    AutoCompleteTextView editText = view.findViewById(R.id.actv1);
    AutoCompleteMarcaAdapter adapter = new AutoCompleteMarcaAdapter(getActivity(), marcaList);
    editText.setAdapter(adapter);

    AutoCompleteTextView editText2 = view.findViewById(R.id.actv2);
    ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_list_item_1, CAROSERIE);
    editText2.setAdapter(adapter2);

    AutoCompleteTextView editText3 = view.findViewById(R.id.actv3);
    ArrayAdapter<String> adapter3 = new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_list_item_1, COMBUSTIBIL);
    editText3.setAdapter(adapter3);

    AutoCompleteTextView editText4 = view.findViewById(R.id.actv4);
    ArrayAdapter<String> adapter4 = new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_list_item_1, CULOARE);
    editText4.setAdapter(adapter4);




    return view;
}

private void fillMarcaList() {

    ...


    sqLiteHelper = new SQLiteHelper(getActivity(), "CarDB.sqlite", null, 1);

    sqLiteHelper.queryData("CREATE TABLE IF NOT EXISTS CAR (Id INTEGER PRIMARY KEY AUTOINCREMENT, alegemarca VARCHAR, model VARCHAR, caroserie VARCHAR, combustibil VARCHAR, culoare VARCHAR, fabricatie VARCHAR, pret VARCHAR, image BLOG)");

    btnChoose.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String[] permissions =  new String[]{Manifest.permission.READ_EXTERNAL_STORAGE};

            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
                return;

            for (String permission : permissions) {
                if (ContextCompat.checkSelfPermission(getActivity(), permission) != PackageManager.PERMISSION_GRANTED) {
                    requestPermissions(permissions, REQUEST_CODE_GALLERY); // triggers onRequestPermissionsResult() each time a permission is granted in 'permissions'
                } else {
                    Toast.makeText(getActivity(), "Permission Already Granted", Toast.LENGTH_SHORT).show();

                    Intent intent = new Intent(Intent.ACTION_PICK);
                    intent.setType("image/*");
                    startActivityForResult(intent, REQUEST_CODE_GALLERY);
                }
            }
        }
    });

    btnAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            try{
                sqLiteHelper.insertData(
                        actv1.getText().toString().trim(),
                        edtModel.getText().toString().trim(),
                        actv2.getText().toString().trim(),
                        actv3.getText().toString().trim(),
                        actv4.getText().toString().trim(),
                        edtFabricatie.getText().toString().trim(),
                        edtPret.getText().toString().trim(),
                        imageViewToByte(imageView3)
                );
                Toast.makeText(getActivity().getApplicationContext(), "Added successfully!", Toast.LENGTH_SHORT).show();
                actv1.setText("");
                edtModel.setText("");
                actv2.setText("");
                actv3.setText("");
                actv4.setText("");
                edtFabricatie.setText("");
                edtPret.setText("");
                imageView3.setImageResource(R.mipmap.ic_launcher);
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
    });

}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    if (requestCode == REQUEST_CODE_GALLERY) {
        if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType("image/*");
            startActivityForResult(intent, REQUEST_CODE_GALLERY);
        }
        else {
            Toast.makeText(getContext(), "You don't have permission to acces file location!", Toast.LENGTH_SHORT).show();
        }
        return;

    }

    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {


    if(requestCode == REQUEST_CODE_GALLERY && resultCode == Activity.RESULT_OK && data != null) {
        Uri uri = data.getData();
        try {
            InputStream inputStream = getActivity().getContentResolver().openInputStream(uri);

            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            imageView3.setImageBitmap(bitmap);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    super.onActivityResult(requestCode, resultCode, data);
}

private void init(View view){
    actv1 = (EditText) view.findViewById(R.id.actv1);
    edtModel = (EditText) view.findViewById(R.id.edtModel);
    actv2 = (EditText) view.findViewById(R.id.actv2);
    actv3 = (EditText) view.findViewById(R.id.actv3);
    actv4 = (EditText) view.findViewById(R.id.actv4);
    edtFabricatie = (EditText) view.findViewById(R.id.edtFabricatie);
    edtPret = (EditText) view.findViewById(R.id.edtPret);
    btnChoose = (Button) view.findViewById(R.id.btnChoose);
    btnAdd = (Button) view.findViewById(R.id.btnAdd);
    btnList = (Button) view.findViewById(R.id.btnList);
    imageView3 = (ImageView) view.findViewById(R.id.imageView3);
}

public static byte[] imageViewToByte(ImageView image) {
    Bitmap bitmap = ((BitmapDrawable) image.getDrawable()).getBitmap();
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] byteArray = stream.toByteArray();
    return byteArray;
}

}

SQLiteHelper:

package com.example.licenta23;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;

import androidx.annotation.Nullable;

public class SQLiteHelper extends SQLiteOpenHelper {

public SQLiteHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
    super(context, name, factory, version);
}

public void queryData(String sql){
    SQLiteDatabase database = getWritableDatabase();
    database.execSQL(sql);
}

public void insertData(String alegemarca, String model, String caroserie, String combustibil, String culoare, String fabricatie, String pret, byte[] image) {
    SQLiteDatabase database = getWritableDatabase();
    String sql = "INSERT INTO CAR VALUES (NULL, ?, ?, ?, ?, ?, ?, ?)";

    SQLiteStatement statement = database.compileStatement(sql);
    statement.clearBindings();

    statement.bindString(1, alegemarca);
    statement.bindString(2, model);
    statement.bindString(3, caroserie);
    statement.bindString(4, combustibil);
    statement.bindString(5, culoare);
    statement.bindString(6, fabricatie);
    statement.bindString(7, pret);
    statement.bindBlob(8, image);

    statement.executeInsert();
}

public Cursor getData(String sql){
    SQLiteDatabase database = getReadableDatabase();
    return database.rawQuery(sql, null);

}

@Override
public void onCreate(SQLiteDatabase db) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
}

谢谢!

【问题讨论】:

  • 在您的 logcat 中查找可能来自您在添加 onClick() 中的 catch 的堆栈跟踪。我要指出的是,您尝试绑定的参数比 INSERT 语句中的占位符 ?s 多,所以这是一个问题,但我们需要该堆栈跟踪才能确定它是否是当前的。

标签: java android android-studio android-fragments android-sqlite


【解决方案1】:

从外观上看,您应该使用 database.prepareStatement statement.bindString 就像在这个 tutorial 中一样

SQLiteStatement statement = database.prepareStatement(sql);
    statement.clearBindings();

    statement.setString(1, alegemarca);
    statement.setString(2, model);
    statement.setString(3, caroserie);
    statement.setString(4, combustibil);
    statement.setString(5, culoare);
    statement.setString(6, fabricatie);
    statement.setString(7, pret);
    statement.setBytes(8, readFile(image));

    statement.executeInsert();

PS:请注意,我已将您的 bindBlob 更改为 setBytes,正如上面所说的 here

【讨论】:

    【解决方案2】:

    试试这个。这是我的代码。你根据你的要求替换

    package com.softarena.alarmapplication.Database;
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.DatabaseErrorHandler;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteException;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.util.Log;
    
    import androidx.annotation.NonNull;
    import androidx.annotation.Nullable;
    
    import com.softarena.alarmapplication.Models.AlarmModel;
    import com.softarena.alarmapplication.Models.DaysModel;
    import com.softarena.alarmapplication.Models.Fvt_dest_model;
    
    import java.sql.Timestamp;
    import java.util.ArrayList;
    import java.util.List;
    
    
    public class MainDatabase extends SQLiteOpenHelper {
        public static final String DATABASE_NAME = "alarmapp.db";
        public static final int DATABASE_VERSION = 5;
        public static final String TABLE_ALARM = "Alarm";
        public static final String TABLE_DAYS = "weekDays";
        public static final String TABLE_FVT_DEST = "fvt_destination";
        public static final String COLUMN_ID = "id";
        public static final String COLUMN_ALARM_TIME = "alarmtime";
        public static final String COLUMN_ALARM_NAME = "alarmname";
        public static final String COLUMN_ALARM_TUNE = "alarmtune";
        public static final String COLUMN_START_LOC = "startloc";
        public static final String COLUMN_START_LOC_LatLong = "startlatlong";
        public static final String COLUMN_END_LOC = "endloc";
        public static final String COLUMN_END_LOC_LatLong = "endlatlong";
        public static final String COLUMN_TIME_TO_REACH = "timetoreach";
        public static final String COLUMN_START_COUNTRY = "startcountry";
        public static final String COLUMN_END_COUNTRY = "endcountry";
        public static final String COLUMN_RADIUS = "radius";
        public static final String COLUMN_SNOOZE_STATUS = "status";
        public static final String COLUMN_LAST_RING_DATE = "ringdate";
        public static final String COLUMN_TRANSPORT_TYPE = "travel_by";
    
      public static final String CREATE_TABLE_ALARM =
                "CREATE TABLE " + TABLE_ALARM + "("
                        + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                        + COLUMN_ALARM_TIME + " TEXT,"
                        + COLUMN_ALARM_NAME + " TEXT,"
                        + COLUMN_ALARM_TUNE + " TEXT,"
                        + COLUMN_START_LOC + " TEXT,"
                        + COLUMN_START_LOC_LatLong + " TEXT,"
                        + COLUMN_END_LOC + " TEXT,"
                        + COLUMN_END_LOC_LatLong + " TEXT,"
                        + COLUMN_TIME_TO_REACH + " TEXT,"
                        + COLUMN_START_COUNTRY + " TEXT,"
                        + COLUMN_END_COUNTRY + " TEXT,"
                        + COLUMN_RADIUS + " TEXT,"
                        + COLUMN_SNOOZE_STATUS + " TEXT,"
                        + COLUMN_LAST_RING_DATE + " TEXT, "
                        + COLUMN_TRANSPORT_TYPE + " TEXT "
                        + ")";
    
    
        public MainDatabase(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
    
        @Override
        public void onCreate(SQLiteDatabase sqLiteDatabase) {
            sqLiteDatabase.execSQL(CREATE_TABLE_ALARM);
    
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
            sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_ALARM);
            onCreate(sqLiteDatabase);
        }
    
     public boolean adddatainalarm(String alarmTime, String alarmName, String alarmtune, String startLoc, String startlatlong, String endLoc, String endlatlong, String timetoReach, String startCountry, String endCountry, String Radius, String Status, String date,String travelby) {
            SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
            ContentValues contentValues = new ContentValues();
            boolean add = false;
    
            contentValues.put(COLUMN_ALARM_TIME, alarmTime);
            contentValues.put(COLUMN_ALARM_NAME, alarmName);
            contentValues.put(COLUMN_ALARM_TUNE, alarmtune);
            contentValues.put(COLUMN_START_LOC, startLoc);
            contentValues.put(COLUMN_START_LOC_LatLong, startlatlong);
            contentValues.put(COLUMN_END_LOC, endLoc);
            contentValues.put(COLUMN_END_LOC_LatLong, endlatlong);
            contentValues.put(COLUMN_TIME_TO_REACH, timetoReach);
            contentValues.put(COLUMN_START_COUNTRY, startCountry);
            contentValues.put(COLUMN_END_COUNTRY, endCountry);
            contentValues.put(COLUMN_RADIUS, Radius);
            contentValues.put(COLUMN_SNOOZE_STATUS, Status);
            contentValues.put(COLUMN_LAST_RING_DATE, date);
            contentValues.put(COLUMN_TRANSPORT_TYPE, travelby);
    
            try {
                Long result = sqLiteDatabase.insert(TABLE_ALARM, null, contentValues);
    
                if (result == -1) {
                    add = false;
    
                } else {
                    add = true;
                    Log.d("Database : ", "Data add successfully");
                }
    
    
            } catch (Exception e) {
                Log.d("Database error : ", "" + e);
            }
            return add;
        }
    }
    
    
    

    【讨论】:

    • 显然不建议在命令中使用这样的连接参数。您应该查看教程并按照 OP 的方式进行操作,并为每个参数使用问号 (?)。
    猜你喜欢
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2021-05-25
    相关资源
    最近更新 更多