Autore Topic: modifica dell'esempio NotesList : aggiungere un altra tabella  (Letto 786 volte)

Offline sandro

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: +1
    • Mostra profilo
modifica dell'esempio NotesList : aggiungere un altra tabella
« il: 11 Febbraio 2011, 15:32:10 CET »
0
Ciao a tutti,

ho provato a modificare l'esempio di NotesList per aggiungere un'altra tabella nel database la quale corrisponde ad un altro oggetto che chiamerò "Notes2".
Ho creato un activity che mi fa da menu per scegliere se voglio editare "Notes" o "Notes2".
Qui sorge il mio dubbio: come descrivere due tabelle appartenenti allo stesso database?

nel manifest devo mettere due provider?
Codice (XML): [Seleziona]
<provider android:name="NotePadProvider"
           android:authorities="com.google.provider.NotePad"
       />
       
        <provider android:name="NotePad2Provider"
           android:authorities="com.google.provider.NotePad"
       />

la classe com.google.provider.NotePad a che serve?

Nella classe com.example.android.notepad.NotePad definisco il mio oggetto/tabella "Notes2",
ma come vengono definiti i due Uri, così ?
per l'oggetto "Notes":
Codice (Java): [Seleziona]
Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/notes");e pr l'oggetto "Notes2":
Codice (Java): [Seleziona]
Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/notes2");
grazie

Offline sandro

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: +1
    • Mostra profilo
Re:modifica dell'esempio NotesList : aggiungere un altra tabella
« Risposta #1 il: 11 Febbraio 2011, 16:12:32 CET »
0
per farmi capire meglio posto due screenshot di come deve venire il risultato finale,
ovcvero una schermata (activity) che precede la normale applicazione di esempio NotePad
che mi fa scegliere tra due copie dello stesso programma.
Lo scopo è quello di gestire due tabelle (Notes e Notes2) sullo stesso database 'note_pad.db' .

grazie.

Offline sandro

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: +1
    • Mostra profilo
Re:modifica dell'esempio NotesList : aggiungere un altra tabella
« Risposta #2 il: 11 Febbraio 2011, 16:52:17 CET »
0
Ho fatto qualche passo avanti,
se clicco su Notes va tutto ok, ma se clicco su Notes2 ho un errore :
"java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.notepad/com.example.android.notepad.Notes2List}:
java.lang.IllegalArgumentException: Unknown URI content://com.google.provider.NotePad/notes2".

in allegato il log completo dell'errore e uno screenshot per mostrare quali modifiche ho apportato.

E' un esempio che potrebbe diventare anche un Tutorial, datemi una mano , è utile per capire molte cose.
Grazie.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:modifica dell'esempio NotesList : aggiungere un altra tabella
« Risposta #3 il: 11 Febbraio 2011, 16:58:08 CET »
0
O gli dai due diversi android:authorities oppure li inglobi in un solo content provider.

Offline sandro

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: +1
    • Mostra profilo
Re:modifica dell'esempio NotesList : aggiungere un altra tabella
« Risposta #4 il: 14 Febbraio 2011, 09:51:21 CET »
0
Ciao Ricky`,
grazie per la risposta.

Ho scelto di gestire tutto con un unico provider,
sembra funzionare quasi tutto ma l'unica cosa che non va è
il fatto che quando clicco su "Add note" e quindi invoco la activity "NoteEditor"
mi compare la "Complete action using".

Se ho capito bene è un ambiguità su quale activity invocare.
Io nel manifest ho duplicato le activity cambiandogli solo il nome perchè pensavo che
l'invocazione venisse fatta univocamnete sul nome.
Come posso rendere univoche le chiamate alle activity?

Ho postato un immagine che riassume il mio problema.
Grazie.

Offline sandro

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: +1
    • Mostra profilo
Re:modifica dell'esempio NotesList : aggiungere un altra tabella
« Risposta #5 il: 14 Febbraio 2011, 10:13:07 CET »
0
in riferimentio all'ultima immagine che ho postato  non capisco perchè l'ambiguità non sorge quando scelgo "Notes" , anche in quel caso io ho duoplicato le activity sul manifest ma in questo caso non sorge ambiguità.
Perchè?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:modifica dell'esempio NotesList : aggiungere un altra tabella
« Risposta #6 il: 14 Febbraio 2011, 10:38:02 CET »
0
Generalmente si posta il codice non gli screenhost ;)
C'è scritto anche nelle guideline che trovi nel momento in cui aggiungi un post.

Offline sandro

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: +1
    • Mostra profilo
Re:modifica dell'esempio NotesList : aggiungere un altra tabella
« Risposta #7 il: 14 Febbraio 2011, 11:06:04 CET »
0
Sono d'accordo, ma ovviamente vale per il codice e non per l'interfaccia.
Quando ho potuto ho postato il codice , quando ho dovuto mostrare velocemnte l'aspetto funzionale ho postato l'interfaccia.
Vedilo come un qualcosa di più e non come qualcosa di sbagliato  :-P

Cmq ho fatto dei miglioramenti,
ho risolto l'ambiguità modificando tutti i filter delle action di Notes2,
per semplicità ho aggiunto un "2" a tutte i nomi delle action delle activity che ho duplicato.
posto il manifest:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2007 The Android Open Source Project

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
 
         http://www.apache.org/licenses/LICENSE-2.0
 
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->

<!-- Declare the contents of this Android application.  The namespace
    attribute brings in the Android platform namespace, and the package
    supplies a unique name for the application.  When writing your
    own application, the package name must be changed from "com.example.*"
    to come from a domain that you own or have control over. -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.android.notepad"
>
    <application android:icon="@drawable/app_notes"
       android:label="@string/app_name">
       
        <provider android:name="NotePadProvider"
           android:authorities="com.google.provider.NotePad"/>

                <activity android:name=".Home"
                 android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name="NotesList" android:label="@string/title_notes_list">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.EDIT" />
                <action android:name="android.intent.action.PICK" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.GET_CONTENT" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
            </intent-filter>
        </activity>
       
        <activity android:name="NoteEditor"
           android:theme="@android:style/Theme.Light"
           android:label="@string/title_note"
           android:screenOrientation="sensor"
           android:configChanges="keyboardHidden|orientation"
       >
            <!-- This filter says that we can view or edit the data of
                a single note -->
            <intent-filter android:label="@string/resolve_edit">
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.EDIT" />
                <action android:name="com.android.notepad.action.EDIT_NOTE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
            </intent-filter>

            <!-- This filter says that we can create a new note inside
                of a directory of notes. -->
            <intent-filter>
                <action android:name="android.intent.action.INSERT" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
            </intent-filter>

        </activity>
       
                <activity android:name="TitleEditor" android:label="@string/title_edit_title"
                                android:theme="@android:style/Theme.Dialog"
               android:windowSoftInputMode="stateVisible">
            <!-- This activity implements an alternative action that can be
                performed on notes: editing their title.  It can be used as
                a default operation if the user invokes this action, and is
                available as an alternative action for any note data. -->
            <intent-filter android:label="@string/resolve_title">
                <!-- This is the action we perform.  It is a custom action we
                    define for our application, not a generic VIEW or EDIT
                    action since we are not a general note viewer/editor. -->
                <action android:name="com.android.notepad.action.EDIT_TITLE" />
                <!-- DEFAULT: execute if being directly invoked. -->
                <category android:name="android.intent.category.DEFAULT" />
                <!-- ALTERNATIVE: show as an alternative action when the user is
                    working with this type of data. -->
                <category android:name="android.intent.category.ALTERNATIVE" />
                <!-- SELECTED_ALTERNATIVE: show as an alternative action the user
                    can perform when selecting this type of data. -->
                <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
                <!-- This is the data type we operate on. -->
                <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
            </intent-filter>
        </activity>
       
        <!-- Notes2 : quste sono le activity che ho duplicato per Notes2-->
       
        <activity android:name="Notes2List" android:label="@string/title_notes_list2">
            <intent-filter>
                <action android:name="android.intent.action.VIEW2" />
                <action android:name="android.intent.action.EDIT2" />
                <action android:name="android.intent.action.EDIT2" />
                <action android:name="android.intent.action.PICK2" />
                <category android:name="android.intent.category.DEFAULT2" />
                <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.GET_CONTENT2" />
                <category android:name="android.intent.category.DEFAULT2" />
                <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
            </intent-filter>
        </activity>
       
        <activity android:name="Note2Editor"
           android:theme="@android:style/Theme.Light"
           android:label="@string/title_note2"
           android:screenOrientation="sensor"
           android:configChanges="keyboardHidden|orientation"
       >
            <!-- This filter says that we can view or edit the data of
                a single note -->
            <intent-filter android:label="@string/resolve_edit">
                <action android:name="android.intent.action.VIEW2" />
                <action android:name="android.intent.action.EDIT2" />
                <action android:name="com.android.notepad.action.EDIT_NOTE2" />
                <category android:name="android.intent.category.DEFAULT2" />
                <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
            </intent-filter>

            <!-- This filter says that we can create a new note inside
                of a directory of notes. -->
            <intent-filter>
                <action android:name="android.intent.action.INSERT2" />
                <category android:name="android.intent.category.DEFAULT2" />
                <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
            </intent-filter>

        </activity>
       
                <activity android:name="Title2Editor" android:label="@string/title_edit_title"
                                android:theme="@android:style/Theme.Dialog"
               android:windowSoftInputMode="stateVisible">
            <!-- This activity implements an alternative action that can be
                performed on notes: editing their title.  It can be used as
                a default operation if the user invokes this action, and is
                available as an alternative action for any note data. -->
            <intent-filter android:label="@string/resolve_title">
                <!-- This is the action we perform.  It is a custom action we
                    define for our application, not a generic VIEW or EDIT
                    action since we are not a general note viewer/editor. -->
                <action android:name="com.android.notepad.action.EDIT_TITLE2" />
                <!-- DEFAULT: execute if being directly invoked. -->
                <category android:name="android.intent.category.DEFAULT2" />
                <!-- ALTERNATIVE: show as an alternative action when the user is
                    working with this type of data. -->
                <category android:name="android.intent.category.ALTERNATIVE2" />
                <!-- SELECTED_ALTERNATIVE: show as an alternative action the user
                    can perform when selecting this type of data. -->
                <category android:name="android.intent.category.SELECTED_ALTERNATIVE2" />
                <!-- This is the data type we operate on. -->
                <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
            </intent-filter>
        </activity>
       
    </application>
</manifest>

Offline sandro

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: +1
    • Mostra profilo
Re:modifica dell'esempio NotesList : aggiungere un altra tabella
« Risposta #8 il: 14 Febbraio 2011, 11:47:56 CET »
0
ultimo errore,
non viene trovata una activity:
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.INSERT2 dat=content://com.google.provider.NotePad/notes2 }

Non capisco dove possa essere il problema visto che l'activity sul manifest c'è.
Qualche idea?

Grazie.

log intero :
Codice: [Seleziona]
02-14 10:42:34.836: INFO/ActivityManager(58): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.android.notepad/.Home }
02-14 10:42:35.195: INFO/ActivityManager(58): Start proc com.example.android.notepad for activity com.example.android.notepad/.Home: pid=3080 uid=10032 gids={1015}
02-14 10:42:35.745: INFO/ActivityThread(3080): Publishing provider com.google.provider.NotePad: com.example.android.notepad.NotePadProvider
02-14 10:42:36.386: INFO/ActivityManager(58): Displayed activity com.example.android.notepad/.Home: 1297 ms (total 1297 ms)
02-14 10:42:40.816: INFO/ActivityManager(58): Starting activity: Intent { cmp=com.example.android.notepad/.Notes2List }
02-14 10:42:41.596: INFO/ActivityManager(58): Displayed activity com.example.android.notepad/.Notes2List: 726 ms (total 726 ms)
02-14 10:42:43.736: WARN/KeyCharacterMap(3080): No keyboard for id 0
02-14 10:42:43.736: WARN/KeyCharacterMap(3080): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
02-14 10:42:45.976: WARN/IntentResolver(58): resolveIntent failed: found match, but none with Intent.CATEGORY_DEFAULT
02-14 10:42:45.976: INFO/ActivityManager(58): Starting activity: Intent { act=android.intent.action.INSERT2 dat=content://com.google.provider.NotePad/notes2 }
02-14 10:42:45.976: DEBUG/AndroidRuntime(3080): Shutting down VM
02-14 10:42:45.976: WARN/dalvikvm(3080): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080): FATAL EXCEPTION: main
02-14 10:42:46.006: ERROR/AndroidRuntime(3080): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.INSERT2 dat=content://com.google.provider.NotePad/notes2 }
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1408)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1378)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at android.app.Activity.startActivityForResult(Activity.java:2817)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at android.app.Activity.startActivity(Activity.java:2923)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at com.example.android.notepad.Notes2List.onOptionsItemSelected(Notes2List.java:151)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at android.app.Activity.onMenuItemSelected(Activity.java:2195)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:730)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:143)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:532)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at android.view.View$PerformClick.run(View.java:8816)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at android.os.Handler.handleCallback(Handler.java:587)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at android.os.Looper.loop(Looper.java:123)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at android.app.ActivityThread.main(ActivityThread.java:4627)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at java.lang.reflect.Method.invokeNative(Native Method)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at java.lang.reflect.Method.invoke(Method.java:521)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-14 10:42:46.006: ERROR/AndroidRuntime(3080):     at dalvik.system.NativeStart.main(Native Method)
02-14 10:42:46.026: WARN/ActivityManager(58):   Force finishing activity com.example.android.notepad/.Notes2List
02-14 10:42:46.546: WARN/ActivityManager(58): Activity pause timeout for HistoryRecord{45058798 com.example.android.notepad/.Notes2List}
02-14 10:42:48.496: INFO/Process(3080): Sending signal. PID: 3080 SIG: 9
02-14 10:42:48.516: INFO/ActivityManager(58): Process com.example.android.notepad (pid 3080) has died.
02-14 10:42:48.556: INFO/WindowManager(58): WIN DEATH: Window{45010c28 com.example.android.notepad/com.example.android.notepad.Home paused=false}
02-14 10:42:48.556: INFO/WindowManager(58): WIN DEATH: Window{45010ee0 com.example.android.notepad/com.example.android.notepad.Notes2List paused=false}
02-14 10:42:48.556: INFO/WindowManager(58): WIN DEATH: Window{45036f68 AtchDlg:com.example.android.notepad/com.example.android.notepad.Notes2List paused=false}
02-14 10:42:48.626: INFO/UsageStats(58): Unexpected resume of com.android.launcher while already resumed in com.example.android.notepad
02-14 10:42:48.706: WARN/InputManagerService(58): Got RemoteException sending setActive(false) notification to pid 3080 uid 10032

Offline sandro

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: +1
    • Mostra profilo
Re:modifica dell'esempio NotesList : aggiungere un altra tabella
« Risposta #9 il: 15 Febbraio 2011, 12:29:59 CET »
+1
ok ho risolto facendo in modo che ogni Intent fosse eslicito, non ho utilizzato i filter per richiamare una activity,
esempio:

prima
Codice (Java): [Seleziona]
@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        Uri uri = ContentUris.withAppendedId(getIntent().getData(), id);
       
        String action = getIntent().getAction();
        if (Intent.ACTION_PICK.equals(action) || Intent.ACTION_GET_CONTENT.equals(action)) {
            // The caller is waiting for us to return a note selected by
            // the user.  The have clicked on one, so return it now.
            setResult(RESULT_OK, new Intent().setData(uri));
        } else {
            // Launch activity to view/edit the currently selected item
            startActivity(new Intent(Intent.ACTION_EDIT, uri));
        }
    }

dopo
Codice (Java): [Seleziona]
@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        Uri uri = ContentUris.withAppendedId(getIntent().getData(), id);
       
        String action = getIntent().getAction();
        if (Intent.ACTION_PICK.equals(action) || Intent.ACTION_GET_CONTENT.equals(action)) {
            // The caller is waiting for us to return a note selected by
            // the user.  The have clicked on one, so return it now.
            setResult(RESULT_OK, new Intent().setData(uri));
        } else {
            // Launch activity to view/edit the currently selected item
            Intent myIntent = new Intent(this, NoteEditor.class);
                myIntent.setAction(Intent.ACTION_EDIT);
                myIntent.setData(uri);
                this.startActivity(myIntent);
        }
    }