Вставка данных с помощью контент-провайдера в Android Studio

#java #android

#java #Android

Вопрос:

Я пытаюсь написать программу CFM.java для вставки данных в таблицу продуктов с помощью контент-провайдера с использованием Android Studio. Но приложение выходит из строя после нажатия на кнопку добавить, чтобы добавить запись в базу данных. Я не могу решить эту проблему. Любая помощь искренне ценится.

MyContentProvider.java `

 package com.example.cfm;


        import android.content.ContentProvider;
        import android.content.ContentUris;
        import android.content.ContentValues;
        import android.content.Context;

        import android.content.UriMatcher;
        import android.database.Cursor;

        import android.database.SQLException;
        import android.database.sqlite.SQLiteDatabase;
        import android.database.sqlite.SQLiteOpenHelper;
        import android.database.sqlite.SQLiteQueryBuilder;
        import android.net.Uri;


        import java.util.HashMap;
        import android.text.TextUtils;

    public class MyContentProvider extends ContentProvider {
    public MyContentProvider() {}



    static final String PROVIDER_NAME = "com.example.cfm.MyContentProvider";
    static final String URL = "content://"   PROVIDER_NAME   "/food_products";
    static final Uri CONTENT_URI = Uri.parse(URL);

    static final String _ID = "_id";
    static final String NAME = "name";
    static final String COSTPERITEM = "cost";
    static final String NOOFITEMS = "itemsno";




    private static HashMap<String, String> PRODUCT_PROJECTION_MAP;

    static final int PRODUCTS = 1;
    static final int PRODUCTS_ID = 2;

    static final UriMatcher uriMatcher;


    static {
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI(PROVIDER_NAME, "products", PRODUCTS);
        uriMatcher.addURI(PROVIDER_NAME, "products/#",PRODUCTS_ID);
    }

    private SQLiteDatabase db;
    static final String DATABASE_NAME = "ProductDetails";
    static final String PRODUCT_TABLE_NAME = "food_products";
    static final int DATABASE_VERSION = 1;
    static final String CREATE_TABLE = " CREATE TABLE "   PRODUCT_TABLE_NAME 
            " (_id INTEGER PRIMARY KEY AUTOINCREMENT, "
              " name TEXT NOT NULL,"  
            "cost DECIMAL(6,2) NOT NULL," 
                "itemsno INTEGER NOT NULL)";

    private static class DatabaseHelper extends SQLiteOpenHelper{
                DatabaseHelper (Context context){
                    super(context, DATABASE_NAME ,null,DATABASE_VERSION);
                }
                @Override
        public void onCreate(SQLiteDatabase db)
        {
            db.execSQL(CREATE_TABLE);
        }

        public void onUpgrade(SQLiteDatabase db,int previousversion,int newversion)
        {
            db.execSQL("DROP TABLE IF EXISTS "   PRODUCT_TABLE_NAME);
            onCreate(db);
        }
    }

    @Override
    public boolean onCreate() {
        Context context = getContext();
        DatabaseHelper dbHelper = new DatabaseHelper(context);
        db = dbHelper.getWritableDatabase();
        if (db != null) {
            return true;
        }
        return false;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) throws SQLException {


            long rowID = db.insert("PRODUCT_TABLE_NAME", "", values);

            if (rowID > 0) {
                Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID);
                getContext().getContentResolver().notifyChange(_uri, null);
                return _uri;
            }
        throw new SQLException("RECORD NOT ADDED INTO"   uri);

    }


    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        qb.setTables(PRODUCT_TABLE_NAME);

            switch (uriMatcher.match(uri)) {
            case PRODUCTS:
                qb.setProjectionMap(PRODUCT_PROJECTION_MAP);
                break;
                case PRODUCTS_ID:
                qb.appendWhere( _ID   "="   uri.getPathSegments().get(1));
                break;
                default:
        }

        if (sortOrder == null || sortOrder =="") {
            sortOrder = NAME;
        }
        Cursor c = qb.query(db, projection, selection, selectionArgs, null,
                null, sortOrder);
        c.setNotificationUri(getContext().getContentResolver(), uri);
        return c;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs)
    {
        int count = 0;
        switch (uriMatcher.match(uri)){
            case PRODUCTS:
                count = db.delete(PRODUCT_TABLE_NAME,_ID   " id = ?"  (!TextUtils.isEmpty(selection)? "AND("   selection   ')' : ""), selectionArgs);
                break;

            default:
                throw new IllegalArgumentException("UNKOWN URI "   uri );
        }

        getContext().getContentResolver().notifyChange(uri,null);
        return count;
    }


        @Override
        public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
            int count = 0;
            switch (uriMatcher.match(uri)) {
                case PRODUCTS:
                    count = db.update(PRODUCT_TABLE_NAME, values, selection, selectionArgs);
                    break;

                case PRODUCTS_ID:
                    count = db.update(PRODUCT_TABLE_NAME,values,_ID "=" uri.getPathSegments().get(1)  
                            (!TextUtils.isEmpty(selection) ?"AND ("   selection   ')':
                                    ""), selectionArgs);
                default:
                    throw new IllegalArgumentException("Unknown URI "   uri);
            }
        getContext().getContentResolver().notifyChange(uri, null);
            return count;
        }

    @Override
    public String getType(Uri uri) {
        switch (uriMatcher.match(uri)) {
            case PRODUCTS:
                return "vnd.android.cursor.dir/vnd.example.food_products";
            case PRODUCTS_ID:
                return  "und.android.cursor.item/vnd.example.students";
            default:
                throw new IllegalArgumentException("Unsupported URI: "   uri);
        }
    }


}



   
  

MainActivity.java

 package com.example.cfm;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ContentValues;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {


    Button add;
    EditText Name;
    EditText Cost;
    EditText No;
    TextView seeProduct;
    TextView seeCost;
    TextView seeNo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        add = findViewById(R.id.btnAdd);
        Name = findViewById(R.id.editText1);
        No = findViewById(R.id.editText2);
        Cost = findViewById(R.id.editText3);
        seeProduct = findViewById(R.id.product);
        seeCost = findViewById(R.id.cost);
        seeNo = findViewById(R.id.no);


    }

    public void onClickAddName(View view) {


                 ContentValues values = new ContentValues();
                 values.put(MyContentProvider.NAME, (Name).getText().toString());

                 values.put(MyContentProvider.NOOFITEMS, (No).getText().toString());

                 values.put(MyContentProvider.COSTPERITEM, (Cost).getText().toString());

                 Uri uri = getContentResolver().insert(MyContentProvider.CONTENT_URI, values);
                 //Name.setText("");
                  assert uri != null;
                 Toast.makeText(getBaseContext(),uri.toString(), Toast.LENGTH_LONG).show();

        }
  

}

Трассировка стека при нажатии кнопки ДОБАВИТЬ

 Caused by: android.database.SQLException: RECORD NOT ADDED INTOcontent://com.example.cfm.MyContentProvider/food_products
    at com.example.cfm.MyContentProvider.insert(MyContentProvider.java:76)
    at android.content.ContentProvider.insert(ContentProvider.java:1673)
    at android.content.ContentProvider$Transport.insert(ContentProvider.java:336)
    at android.content.ContentResolver.insert(ContentResolver.java:2149)
    at android.content.ContentResolver.insert(ContentResolver.java:2111)
    at com.example.cfm.MainActivity.onClickAddName(MainActivity.java:39)
    at java.lang.reflect.Method.invoke(Native Method) 
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409) 
    at android.view.View.performClick(View.java:7448) 
    at android.view.View.performClickInternal(View.java:7425) 
    at android.view.View.access$3600(View.java:810) 
    at android.view.View$PerformClick.run(View.java:28296) 
    at android.os.Handler.handleCallback(Handler.java:938) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:223) 
    at android.app.ActivityThread.main(ActivityThread.java:7656) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947 

Комментарии:

1. Пожалуйста, предоставьте трассировку стека для сбоя.