J'ai suivi un didacticiel pour développer un formulaire d'inscription d'utilisateur. En suivant ce code, je crée un autre client d'appel de table et crée d'autres classes pertinentes. Mais une fois que je clique sur le bouton Enregistrer, mon application a cessé de fonctionner. J'essaye beaucoup de corriger cette erreur, mais ça ne marche pas. S'il vous plaît, si quelqu'un pouvait m'aider à trouver ce problème, j'apprécie vraiment votre aide. MerciProblème lors de l'enregistrement des données dans la base de données Android Sqlite avec plusieurs tables
Il s'agit du fichier activity_client.xml.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nestedScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBackground"
android:paddingBottom="20dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingTop="20dp">
<android.support.v7.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:layout_marginTop="0dp"
android:text="@string/subhead"
android:textSize="30sp"
android:textStyle="bold" />
<!--Company Name-->
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayoutCmpyName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp">
<android.support.design.widget.TextInputEditText
android:id="@+id/textInputEditTextCmpyName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hintCmpyName"
android:inputType="text"
android:maxLines="1"
android:textColor="@android:color/black" />
</android.support.design.widget.TextInputLayout>
<!--Address-->
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayoutCmpyAddress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp">
<android.support.design.widget.TextInputEditText
android:id="@+id/textInputEditTextAddress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hintCmpyAddress"
android:inputType="text"
android:maxLines="5"
android:textColor="@android:color/black" />
</android.support.design.widget.TextInputLayout>
<!--Mobile-->
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayoutCmpyMobile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp">
<android.support.design.widget.TextInputEditText
android:id="@+id/textInputEditTextMobile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hintClientMobile"
android:inputType="text"
android:maxLines="5"
android:textColor="@android:color/black" />
</android.support.design.widget.TextInputLayout>
<!--Email-->
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayoutCmpyEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp">
<android.support.design.widget.TextInputEditText
android:id="@+id/textInputEditTextEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hintClientEmail"
android:inputType="text"
android:maxLines="5"
android:textColor="@android:color/black" />
</android.support.design.widget.TextInputLayout>
</android.support.v7.widget.LinearLayoutCompat>
<android.support.v7.widget.AppCompatButton
android:id="@+id/appCompatButtonBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_gravity="right"
android:layout_marginBottom="357dp"
android:layout_marginEnd="36dp"
android:layout_marginRight="36dp"
android:background="@color/colorTextHint"
android:text="@string/text_back" />
<!--save button-->
<android.support.v7.widget.AppCompatButton
android:id="@+id/appCompatButtonSave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/appCompatButtonBack"
android:layout_alignBottom="@+id/appCompatButtonBack"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginLeft="38dp"
android:layout_marginStart="38dp"
android:background="@color/colorTextHint"
android:text="@string/text_save" />
</RelativeLayout>
DataBaseHelper class in an package call dbclasses. Yhis class has code for both ClentInfo class and UserRegister class;another class.
DataBaseHelper public class étend SQLiteOpenHelper {
//Database version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "Database1.db";
//table names
private static final String TABLE_USER = "user"; // User table name
private static final String TABLE_CLIENT = "client";
//Client Table Columns names
private static final String COLUMN_CLIENT_ID = "client_id";
private static final String COLUMN_CLIENT_NAME = "client_name";
private static final String COLUMN_CLIENT_ADDRESS = "client_address";
private static final String COLUMN_CLIENT_MOBILE = "client_mobile";
private static final String COLUMN_CLIENT_EMAIL = "client_email";
//create client table
private String CREATE_CLIENT_TABLE = "CREATE TABLE " + TABLE_CLIENT + "("
+ COLUMN_CLIENT_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ COLUMN_CLIENT_NAME + " TEXT,"
+ COLUMN_CLIENT_ADDRESS + " TEXT,"
+ COLUMN_CLIENT_MOBILE + " TEXT,"
+ COLUMN_CLIENT_EMAIL + " TEXT"
+ ")";
// drop table sql query
private String DROP_USER_TABLE = "DROP TABLE IF EXISTS " + TABLE_USER; //for user table
private String DROP_CLIENT_TABLE = "DROP TABLE IF EXISTS " + TABLE_CLIENT;
public DataBaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_USER_TABLE);
db.execSQL(CREATE_CLIENT_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
db.execSQL(DROP_USER_TABLE);
db.execSQL(DROP_CLIENT_TABLE);
//create new tables
onCreate(db);
}
//---------------------------client table methods--------------------
//add user
public void addClient(Client client) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_CLIENT_NAME, client.getCmpyName());
values.put(COLUMN_CLIENT_ADDRESS, client.getAddress());
values.put(COLUMN_CLIENT_MOBILE, client.getMobile());
values.put(COLUMN_USER_EMAIL, client.getEmail());
//Inserting Row
db.insert(TABLE_CLIENT, null, values);
db.close();
}
//get all clients
public List<Client> getAllClients() {
String columns1[] = {
COLUMN_CLIENT_ID,
COLUMN_CLIENT_NAME,
COLUMN_CLIENT_ADDRESS,
COLUMN_CLIENT_MOBILE,
COLUMN_USER_EMAIL
};
//sorting orders
String sortOrder = COLUMN_CLIENT_NAME + " ASC";
List<Client> clientList = new ArrayList<Client>();
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_CLIENT,
columns1,
null,
null,
null,
null,
sortOrder);
if (cursor.moveToFirst()) {
do {
Client client = new Client();
client.setCid(Integer.parseInt(cursor.getString(cursor.getColumnIndex(COLUMN_CLIENT_ID))));
client.setCmpyName(cursor.getString(cursor.getColumnIndex(COLUMN_CLIENT_NAME)));
client.setAddress(cursor.getString(cursor.getColumnIndex(COLUMN_CLIENT_ADDRESS)));
client.setMobile(cursor.getString(cursor.getColumnIndex(COLUMN_CLIENT_MOBILE)));
client.setEmail(cursor.getString(cursor.getColumnIndex(COLUMN_CLIENT_EMAIL)));
//adding clients to list
clientList.add(client);
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return clientList;
}
//update the clients
public void updateClient(Client client) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_CLIENT_NAME, client.getCmpyName());
values.put(COLUMN_CLIENT_ADDRESS, client.getAddress());
values.put(COLUMN_CLIENT_MOBILE, client.getMobile());
values.put(COLUMN_USER_EMAIL, client.getEmail());
//updating row
db.update(TABLE_CLIENT, values, COLUMN_CLIENT_ID + " = ?",
new String[]{
String.valueOf(client.getCid())
});
db.close();
}
public boolean checkClient(String cmpyName) {
String[] columns = {
COLUMN_CLIENT_ID
};
SQLiteDatabase db = this.getReadableDatabase();
String selection = COLUMN_CLIENT_NAME + " = ?";
// selection argument
String[] selectionArgs = {cmpyName};
Cursor cursor = db.query(TABLE_CLIENT, //Table to query
columns, //columns to return
selection, //columns for the WHERE clause
selectionArgs, //The values for the WHERE clause
null, //group the rows
null, //filter by row groups
null); //The sort order
int cursorCount = cursor.getCount();
cursor.close();
db.close();
if (cursorCount > 0) {
return true;
}
return false;
}
}
C'est la classe ClientActivity dans le package client
package com.example.user.application001.Client;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TextInputEditText;
import android.support.design.widget.TextInputLayout;
import android.support.v4.widget.NestedScrollView;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.AppCompatButton;
import android.view.View;
import android.widget.Toast;
import com.example.user.application001.R;
import dbclasses.DataBaseHelper;
import modelclasses.Client;
public class ClientActivity extends AppCompatActivity implements View.OnClickListener {
private final AppCompatActivity activity = ClientActivity.this;
private DataBaseHelper dbHelper;
private ClientValidation clientValidation;
private Client client;
//private NestedScrollView nestedScrollView;
private TextInputLayout textInputLayoutCmpyName, textInputLayoutCmpyAddress, textInputLayoutCmpyMobile, textInputLayoutCmpyEmail;
private TextInputEditText textInputEditTextCmpyName, textInputEditTextAddress, textInputEditTextMobile, textInputEditTextEmail;
private AppCompatButton appCompatButtonSave, appCompatButtonBack;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_client);
setTitle("Customer Information");
initViews();
initListeners();
initObjects();
}
public void initViews() {
//nestedScrollView = (NestedScrollView) findViewById(R.id.nestedScrollView);
textInputLayoutCmpyName = (TextInputLayout) findViewById(R.id.textInputLayoutCmpyName);
textInputLayoutCmpyAddress = (TextInputLayout) findViewById(R.id.textInputLayoutCmpyAddress);
textInputLayoutCmpyMobile = (TextInputLayout) findViewById(R.id.textInputLayoutCmpyMobile);
textInputLayoutCmpyEmail = (TextInputLayout) findViewById(R.id.textInputLayoutCmpyEmail);
textInputEditTextCmpyName = (TextInputEditText) findViewById(R.id.textInputEditTextCmpyName);
textInputEditTextAddress = (TextInputEditText) findViewById(R.id.textInputEditTextAddress);
textInputEditTextMobile = (TextInputEditText) findViewById(R.id.textInputEditTextMobile);
textInputEditTextEmail = (TextInputEditText) findViewById(R.id.textInputEditTextEmail);
appCompatButtonSave = (AppCompatButton) findViewById(R.id.appCompatButtonSave);
appCompatButtonBack = (AppCompatButton) findViewById(R.id.appCompatButtonBack);
}
public void initListeners() {
appCompatButtonBack.setOnClickListener(this);
appCompatButtonSave.setOnClickListener(this);
}
public void initObjects() {
clientValidation = new ClientValidation(activity);
dbHelper = new DataBaseHelper(activity);
client = new Client();
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.appCompatButtonSave:
savetoSQliteDb();
break;
case R.id.appCompatButtonBack:
break;
}
}
private void savetoSQliteDb(){
if (!clientValidation.isInputEditTextFilled(textInputEditTextCmpyName, textInputLayoutCmpyName, getString(R.string.errorCmpyName))){
return;
}
if (!clientValidation.isInputEditTextFilled(textInputEditTextAddress, textInputLayoutCmpyAddress, getString(R.string.errorCmpyAddress))){
return;
}
if (!clientValidation.isInputEditTextFilled(textInputEditTextMobile, textInputLayoutCmpyMobile, getString(R.string.errorCustomerMobile))){
return;
}if (!clientValidation.isInputEditTextFilled(textInputEditTextEmail, textInputLayoutCmpyEmail, getString(R.string.errorCustomerEmail))){
return;
}
if (!dbHelper.checkClient(textInputEditTextCmpyName.getText().toString())){
client.setCmpyName(textInputEditTextCmpyName.getText().toString().trim());
client.setAddress(textInputEditTextAddress.getText().toString().trim());
client.setMobile(textInputEditTextMobile.getText().toString().trim());
client.setEmail(textInputEditTextEmail.getText().toString().trim());
//add one record
dbHelper.addClient(client);
emptyInputEditText();
// Toast.makeText(getApplicationContext(), "Data Entered", Toast.LENGTH_LONG).show();
}
}
private void emptyInputEditText() {
textInputEditTextCmpyName.setText(null);
textInputEditTextAddress.setText(null);
textInputEditTextMobile.setText(null);
textInputEditTextEmail.setText(null);
}
}
This is the ClientValidation Java class. This is also in the client package
package com.example.user.application001.Client;
import android.app.Activity;
import android.content.Context;
import android.support.design.widget.TextInputEditText;
import android.support.design.widget.TextInputLayout;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
/**
* Created by User on 9/28/2017.
*/
public class ClientValidation {
private Context context;
public ClientValidation(Context context) {
this.context = context;
}
public boolean isInputEditTextFilled(TextInputEditText textInputEditText, TextInputLayout textInputLayout, String message) {
String value = textInputEditText.getText().toString().trim();
if (value.isEmpty()) {
textInputLayout.setError(message);
hideKeyboardFrom(textInputEditText);
return false;
} else {
textInputLayout.setErrorEnabled(false);
}
return true;
}
private void hideKeyboardFrom(View view) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
}
This is the Client class. It is in modelclasses package.
package modelclasses;
/**
* Created by User on 9/26/2017.
*/
public class Client {
private int cid;
private String cmpyName;
private String address;
private String mobile;
private String email;
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getCmpyName() {
return cmpyName;
}
public void setCmpyName(String cmpyName) {
this.cmpyName = cmpyName;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
logcat
/split_lib_slice_3_apk.apk --oat-file=/data/dalvik-cache/x86/[email protected]@[email protected][email protected]) because non-0 exit status
09-29 08:29:01.252 4993-4993/? W/art: Failed execv(/system/bin/dex2oat --runtime-arg -classpath --runtime-arg --debuggable --instruction-set=x86 --instruction-set-features=smp,ssse3,-sse4.1,-sse4.2,-avx,-avx2 --runtime-arg -Xrelocate --boot-image=/system/framework/boot.art --runtime-arg -Xms64m --runtime-arg -Xmx512m --instruction-set-variant=x86 --instruction-set-features=default --dex-file=/data/app/com.example.user.application001-2/split_lib_slice_4_apk.apk --oat-file=/data/dalvik-cache/x86/[email protected]@[email protected]_lib_slice_4_ap[email protected]) because non-0 exit status
09-29 08:29:01.264 4993-4993/? W/art: Failed execv(/system/bin/dex2oat --runtime-arg -classpath --runtime-arg --debuggable --instruction-set=x86 --instruction-set-features=smp,ssse3,-sse4.1,-sse4.2,-avx,-avx2 --runtime-arg -Xrelocate --boot-image=/system/framework/boot.art --runtime-arg -Xms64m --runtime-arg -Xmx512m --instruction-set-variant=x86 --instruction-set-features=default --dex-file=/data/app/com.example.user.application001-2/split_lib_slice_5_apk.apk --oat-file=/data/dalvik-cache/x86/[email protected]@[email protected][email protected]) because non-0 exit status
09-29 08:29:01.276 4993-4993/? W/art: Failed execv(/system/bin/dex2oat --runtime-arg -classpath --runtime-arg --debuggable --instruction-set=x86 --instruction-set-features=smp,ssse3,-sse4.1,-sse4.2,-avx,-avx2 --runtime-arg -Xrelocate --boot-image=/system/framework/boot.art --runtime-arg -Xms64m --runtime-arg -Xmx512m --instruction-set-variant=x86 --instruction-set-features=default --dex-file=/data/app/com.example.user.application001-2/split_lib_slice_6_apk.apk --oat-file=/data/dalvik-cache/x86/[email protected]@[email protected][email protected]) because non-0 exit status
09-29 08:29:01.290 4993-4993/? W/art: Failed execv(/system/bin/dex2oat --runtime-arg -classpath --runtime-arg --debuggable --instruction-set=x86 --instruction-set-features=smp,ssse3,-sse4.1,-sse4.2,-avx,-avx2 --runtime-arg -Xrelocate --boot-image=/system/framework/boot.art --runtime-arg -Xms64m --runtime-arg -Xmx512m --instruction-set-variant=x86 --instruction-set-features=default --dex-file=/data/app/com.example.user.application001-2/split_lib_slice_7_apk.apk --oat-file=/data/dalvik-cache/x86/[email protected]@[email protected][email protected]) because non-0 exit status
09-29 08:29:01.305 4993-4993/? W/art: Failed execv(/system/bin/dex2oat --runtime-arg -classpath --runtime-arg --debuggable --instruction-set=x86 --instruction-set-features=smp,ssse3,-sse4.1,-sse4.2,-avx,-avx2 --runtime-arg -Xrelocate --boot-image=/system/framework/boot.art --runtime-arg -Xms64m --runtime-arg -Xmx512m --instruction-set-variant=x86 --instruction-set-features=default --dex-file=/data/app/com.example.user.application001-2/split_lib_slice_8_apk.apk --oat-file=/data/dalvik-cache/x86/[email protected]@[email protected][email protected]) because non-0 exit status
09-29 08:29:01.317 4993-4993/? W/art: Failed execv(/system/bin/dex2oat --runtime-arg -classpath --runtime-arg --debuggable --instruction-set=x86 --instruction-set-features=smp,ssse3,-sse4.1,-sse4.2,-avx,-avx2 --runtime-arg -Xrelocate --boot-image=/system/framework/boot.art --runtime-arg -Xms64m --runtime-arg -Xmx512m --instruction-set-variant=x86 --instruction-set-features=default --dex-file=/data/app/com.example.user.application001-2/split_lib_slice_9_apk.apk --oat-file=/data/dalvik-cache/x86/[email protected]@[email protected][email protected]) because non-0 exit status
09-29 08:29:01.318 4993-4993/? W/System: ClassLoader referenced unknown path: /data/app/com.example.user.application001-2/lib/x86
09-29 08:29:01.320 4993-4993/? I/InstantRun: starting instant run server: is main process
09-29 08:29:01.384 4993-4993/? W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
09-29 08:29:01.495 4993-5038/? D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
[ 09-29 08:29:01.497 4993: 4993 D/ ]
HostConnection::get() New Host Connection established 0xa4187280, tid 4993
[ 09-29 08:29:01.498 4993: 4993 W/ ]
Unrecognized GLES max version string in extensions: ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_dma_v1
[ 09-29 08:29:01.523 4993: 5038 D/ ]
HostConnection::get() New Host Connection established 0xaaffbd40, tid 5038
[ 09-29 08:29:01.524 4993: 5038 W/ ]
Unrecognized GLES max version string in extensions: ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_dma_v1
09-29 08:29:01.526 4993-5038/? I/OpenGLRenderer: Initialized EGL, version 1.4
09-29 08:29:01.526 4993-5038/? W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
09-29 08:29:01.534 4993-5038/? D/EGL_emulation: eglCreateContext: 0xaf0635a0: maj 2 min 0 rcv 2
09-29 08:29:01.535 4993-5038/? D/EGL_emulation: eglMakeCurrent: 0xaf0635a0: ver 2 0 (tinfo 0xaf0528e0)
09-29 08:29:01.554 4993-5038/? D/EGL_emulation: eglMakeCurrent: 0xaf0635a0: ver 2 0 (tinfo 0xaf0528e0)
09-29 08:29:01.610 4993-4993/? W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
Vous devez avoir un regard sur le message d'erreur exacte pour que nous puissions vous aider. Sur Android Studio, il est généralement disponible sous l'onglet Débogage/Exécution en bas, ou sur la vue Logcat également en bas de la fenêtre AS. Habituellement, les premières lignes en rouge seront les plus utiles, suivies des paires de noms de fichiers + numéros de ligne que vous pouvez utiliser pour trouver où se trouve le problème dans votre code. – Fabio
@Fabio, je ne trouve pas l'erreur dans mon logcat concernant la sauvegarde des données – Kash