是否有人将GenericData.Record
与Avro和嵌套地图记录一起使用。给出以下架构,我正在努力填充地图中的GenericData.Record
:
{"name": "log_data", "type":
[ "null",
{ "type": "map", "values":
{ "type": "record",
"name": "TypeValuePair",
"fields": [
{"name": "type", "type": "string"},
{"name": "value", "type": ["null", "string"]}
]
}
}
]
}
java代码:
Schema mapSchema = schema.getField("log_data").schema().getTypes().get(1);
//The code below fails
GenericRecord typeValuePair =
new GenericData.Record(mapSchema.getField("TypeValuePair").schema());
使用:
org.apache.avro.AvroRuntimeException: Not a record..
知道我应该如何构建在包含记录类型值的avro架构中设置地图吗?
答案 0 :(得分:5)
我能够使用以下代码:
Schema mapSchema = schema.getField("log_data").schema().getTypes().get(1);
GenericRecord typeValuePair =
new GenericData.Record(mapSchema.getValueType());
ImmutableMap.Builder<String, GenericRecord> logDataBuilder =
ImmutableMap.<String, GenericRecord>builder();
typeValuePair.put("type","string");
typeValuePair.put("value", "field1 value");
logDataBuilder.put("field1", typeValuePair);
//Set the log_data map field in the schema
GenericRecordBuilder grb = new GenericRecordBuilder(schema);
grb.set("log_data", logDataBuilder.build());
grb.build();
答案 1 :(得分:0)
下面应该有效
public class NewContactActivity extends AppCompatActivity {
UserDbHelper userDbHelper;
SQLiteDatabase sqLiteDatabase;
EditText editText,editText1,editText2;
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_contact);
editText=findViewById(R.id.contect_name);
editText1=findViewById(R.id.mob_number);
editText2=findViewById(R.id.email);
}
public void addcontact(View view)
{
String name= editText.getText().toString();
String number=editText1.getText().toString();
String email=editText2.getText().toString();
userDbHelper=new UserDbHelper(context);
sqLiteDatabase=userDbHelper.getWritableDatabase();
userDbHelper.addinformation(name,number,email,sqLiteDatabase);
Toast.makeText(getBaseContext(), "data saved", Toast.LENGTH_SHORT).show();
}
}