· 7 years ago · Jan 12, 2019, 11:02 AM
1Failed to create SQLite DB in my Google Nexus One device in Android?
2CREATE TABLE android_metadata failed
3Failed to setLocale() when constructing, closing the database
4android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed
5 at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
6 at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1987)
7 at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1855)
8 at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
9 at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)
10 at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)
11 at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:567)
12 at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
13 at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
14 at com.weg.ecatalogue.database.ECatalogueDatabase.open(ECatalogueDatabase.java:76)
15 at com.weg.ecatalogue.HomeScreen.onCreate(HomeScreen.java:219)
16 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
17 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
18 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
19 at android.app.ActivityThread.access$1500(ActivityThread.java:123)
20 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
21 at android.os.Handler.dispatchMessage(Handler.java:99)
22 at android.os.Looper.loop(Looper.java:123)
23 at android.app.ActivityThread.main(ActivityThread.java:3839)
24 at java.lang.reflect.Method.invokeNative(Native Method)
25 at java.lang.reflect.Method.invoke(Method.java:507)
26 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
27 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
28 at dalvik.system.NativeStart.main(Native Method)
29 Deleting and re-creating corrupt database /data/data/com.weg.ecatalogue/databases/ECatalogue
30 android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed
31 at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
32 at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1987)
33 at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1855)
34 at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
35 at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)
36 at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)
37 at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:567)
38 at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
39 at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
40 at com.weg.ecatalogue.database.ECatalogueDatabase.open(ECatalogueDatabase.java:76)
41 at com.weg.ecatalogue.HomeScreen.onCreate(HomeScreen.java:219)
42 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
43 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
44 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
45 at android.app.ActivityThread.access$1500(ActivityThread.java:123)
46 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
47 at android.os.Handler.dispatchMessage(Handler.java:99)
48 at android.os.Looper.loop(Looper.java:123)
49 at android.app.ActivityThread.main(ActivityThread.java:3839)
50 at java.lang.reflect.Method.invokeNative(Native Method)
51 at java.lang.reflect.Method.invoke(Method.java:507)
52 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
53 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
54 at dalvik.system.NativeStart.main(Native Method)
55
56public class ECatalogueDatabase {
57
58 private static final String DB_PATH = "/data/data/com.weg.ecatalogue/databases/";
59 public static final String DATABASE_NAME = "ECatalogue";
60 public static final String DATABASE_TABLE = "T_Electrical";
61 public static final int DATABASE_VERSION = 1;
62
63 public static final String KEY_ROWID="id";
64 public static final String KEY_PRODUCT_LINE="productline";
65
66 public static final String KEY_VOLTAGE="voltage";
67 public static final String KEY_OUTPUTHP="outputhp";
68
69 public static final String KEY_FRAME="frame";
70 public static final String KEY_RPM="rpm";
71
72 private Context context=null;
73 private DatabaseHelper DBHelper;
74 private SQLiteDatabase db;
75
76 /**
77 * Database creation sql statement
78 */
79 private static final String CREAT_DATABASE="Create Table if not exists "+ DATABASE_TABLE+"("+ KEY_ROWID +" INTEGER PRIMARY KEY NOT NULL,"
80 +KEY_PRODUCT_LINE +" nvarchar ,"+ KEY_OUTPUTHP+" numeric ,"+ KEY_RPM +" nvarchar ,"+KEY_VOLTAGE +" nvarchar ," +KEY_FRAME +" nvarchar"+")";
81
82 /**
83 * Constructor - takes the context to allow the database to be
84 * opened/created
85 *
86 * @param ctx the Context within which to work
87 */
88 public ECatalogueDatabase(Context ctx) {
89 this.context = ctx;
90 DBHelper = new DatabaseHelper(context);
91 }
92 //Helper class
93 private static class DatabaseHelper extends SQLiteOpenHelper
94 {
95 public DatabaseHelper(Context context) {
96 super(context, DATABASE_NAME, null, DATABASE_VERSION);
97 }
98
99 @Override
100 public void onCreate(SQLiteDatabase db) {
101 db.execSQL(CREAT_DATABASE);
102 }
103
104 @Override
105 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
106 db.execSQL("DROP TABLE IF EXISTS titles");
107 onCreate(db);
108 }
109
110 }
111
112 public ECatalogueDatabase open() //throws SQLException
113 {
114 try
115 {
116 db=DBHelper.getWritableDatabase();
117
118 }catch(Exception exception)
119 {
120 exception.printStackTrace();
121 }
122 return null;
123 }
124
125
126 public void close()
127 {
128 DBHelper.close();
129 }
130
131
132
133 /**
134 * Creates a empty database on the system and rewrites it with your own database.
135 * */
136 public void createDataBase() throws IOException{
137
138 @SuppressWarnings("unused")
139 boolean dbExist = checkDataBase();
140
141 /**
142 * CHANGES DONE BY SHAILESH SHARMA TO SOLVE THE PROBLEM OF 2.2 HTC DESIRE IN CLIENT'S WIFE DEVICE :(
143 */
144 SQLiteDatabase db_Read = null;
145 if(dbExist){
146 //DO NOTHING IN THIS CASE
147 }else{
148
149 db_Read = DBHelper.getReadableDatabase();
150 db_Read.close();
151 }
152 //=================================
153
154 try {
155
156 copyDataBase();
157
158 } catch (IOException e) {
159
160 throw new Error("Error copying database");
161
162 }
163
164 }
165 /**
166 * Check if the database already exist to avoid re-copying the file each time you open the application.
167 * @return true if it exists, false if it doesn't
168 */
169 private boolean checkDataBase(){
170 try{
171 String myPath = DB_PATH + DATABASE_NAME;
172 db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
173
174 }catch(SQLiteException e){
175 System.out.println(e+"sos sos sos sos");
176 }
177
178 if(db != null){
179
180 db.close();
181
182 }
183
184 return db != null ? true : false;
185 }
186 /**
187 * Copies your database from your local assets-folder to the just created empty database in the
188 * system folder, from where it can be accessed and handled.
189 * This is done by transfering bytestream.
190 * */
191 private void copyDataBase() throws IOException{
192
193
194 InputStream myInput = context.getAssets().open(DATABASE_NAME);
195
196 // Path to the just created empty db
197 String outFileName = DB_PATH + DATABASE_NAME;
198
199
200 OutputStream myOutput = new FileOutputStream(outFileName);
201
202
203 byte[] buffer = new byte[1024];
204 int length;
205 while ((length = myInput.read(buffer))>0){
206 myOutput.write(buffer, 0, length);
207 }
208 myOutput.flush();
209 myOutput.close();
210 myInput.close();
211
212 }
213
214 public int getDatabaseCount(){
215 int count = 0;
216 Cursor cursor = db.rawQuery("Select * from " + DATABASE_TABLE, null);
217 if(cursor!=null){
218 count = cursor.getCount();
219 }
220 cursor.deactivate();
221 cursor.close();
222 return count;
223 }