如何编写在android的Sqlite中插入数据的通用代码

如何编写在android的Sqlite中插入数据的通用代码,android,sqlite,Android,Sqlite,要插入sqlite,我必须遵循以下步骤: 创建contentValues,即contentValues contentValues=新contentValues; 输入列的名称和值 最后,调用sqLiteDatabase.insertDATABASE\u NAME,null,contentValues 问题只出现在步骤2中,假设我有n个列要持久化,我们已经手动使用了n次Columnname和Columnvalue 因此,我编写了以下方法,认为可以重用它: public void insert(M

要插入sqlite,我必须遵循以下步骤:

创建contentValues,即contentValues contentValues=新contentValues; 输入列的名称和值 最后,调用sqLiteDatabase.insertDATABASE\u NAME,null,contentValues 问题只出现在步骤2中,假设我有n个列要持久化,我们已经手动使用了n次Columnname和Columnvalue

因此,我编写了以下方法,认为可以重用它:

public void insert(Map tableMap){

        ContentValues contentValues = new ContentValues();
        Iterator tableMapIterator = tableMap.entrySet().iterator();

        while(tableMapIterator.hasNext()){
            Map.Entry mapEntry = (Map.Entry)tableMapIterator.next();
            contentValues.put((String)mapEntry.getKey(), mapEntry.getValue());
        }
       sqLiteDatabase.insert(DATABASE_NAME,null,contentValues)

    }
但问题是,当我调用mapEntry.getValue时,返回类型是未定义contentValues.put的对象

那么,有谁能告诉我一些解决方法,以便我能够有效地使用上述方法来进行数据插入呢


注意:我想编写一个方法,这样我就可以将它用于SQLITE中的所有数据类型。

我不太确定是否收到了您的问题,但我会尽我所能

1你可以使用一些已经编写好的ORM它可以自动检测字段类型

2您可以编写自己的简单ORM来处理这样的情况。当我想自动将对象添加到数据库中时,我从GenericTableObject继承了这个表对象,它有一些方法,比如GetFieldsValue、getFieldsTypes等等。。。在这些方法的帮助下,它是完全自动化的

您可能会花几个小时来编写这个通用表对象,但它是有用的。-这一切都是关于java反射的。

试试这个

public void addEntity(EntityClass e) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("Name",e.getmProductName());
        values.put("Price",e.getmProductPrice());
        values.put("Date",e.getmPurchaseDate());
        // Inserting Row
        db.insert(TABLE_Accounts, null, values);
        Log.d("insert", "success");
        Toast.makeText(mContext, "Info added Successfully", Toast.LENGTH_SHORT).show();

        db.close(); // Closing database connection




    }

将通过此方法验证访问ContentMap的对象

因此,如果您在ContentValue中放入任何不是预期类型的内容,则将假定它是字符串,在中,将对其调用toString

现在,假设您的所有对象都是可识别的有效类型,或者具有足够的字符串表示形式(例如,文件对象将给出其路径,当您从数据库中提取它时,该路径足以重新创建它),有多种方法可以在ContentValue中放置任意映射

简单的方法是使用反射来访问,它在所有版本的android中都被一致命名为mValues

我发现,另一种更短但更慢、更清晰的方法是使用包裹机制。实际上,只写内部映射

整个代码如下所示:

Parcel parcel = obtain();
parcel.writeMap(map);
parcel.setDataPosition(0);
ContentValues values = ContentValues.CREATOR.createFromParcel(parcel);

在我的博客上详细解释:

ContentValues已经是这样一张地图了。在其周围添加一个包装器并不能真正使代码更简单arcelhttp://njzk2.wordpress.com/2013/05/31/map-to-contentvalues-abusing-parcelable/@laalto:没错,ContentValues已经是一个映射了。但是每次键入所有列名及其值都是一件痛苦的事情。相反,我想传递一个映射列名称作为键,相应的数据作为值,我们可以对其进行迭代和持久化。这将使我能够在整个应用程序中重用insert方法。那么,您计划如何填充和维护该映射?同样的负担只是转移到另一个地方。